• JVM入门


    没写完,慢慢补充..

    1.JVM的位置
    2.JVM的体系结构

    3.类加载器

    • 虚拟机自带的加载器
    • 根加载器(启动类加载器)
    • 扩展类加载器
    • 应用程序加载器
    public class JvmTest1 {
    
        public static void main(String[] args) {
            People people = new People();
    
            System.out.println(people.getClass());
            System.out.println(people.getClass().getClassLoader());
            System.out.println(people.getClass().getClassLoader().getParent());
            System.out.println(people.getClass().getClassLoader().getParent().getParent());
    
        }
    }
    

    输出结果

    class cn.yang37.jvm.pojo.People
    sun.misc.Launcher$AppClassLoader@18b4aac2 //应用程序加载器
    sun.misc.Launcher$ExtClassLoader@1540e19d //扩展类加载器
    null  //底层调用的是C++好像
    

    4.双亲委派机制
    为了保证安全,我们自己写一个同包同名的类,例如String,Java官方的String类怎么办?

    关键就是从上往下找

    类加载器收到加载请求
    将请求向上委托给父类加载器去完成,一直向上委托,故到了根加载器.
    检查是否能加载当前这个类,能就加载,不能就往下转.
    都找不到就是ClassNotFound

    5.沙箱安全机制

    6.Native
    Java诞生时是C和C++的天下,怎么能调用上C/C++的东西呢?
    native方法,会进入本地方法栈,调用本地方法接口实现.

    7.PC寄存器
    程序计数器

    8.方法区
    方法区被所有接口共享,构造函数,接口代码,即所有定义的方法的信息都保存在该区域,此区域属于共享空间

    静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在方法区中.
    但是实例变量存在堆内存中,与方法区无关.

    即static,final,Class,常量池

    9.栈
    类似于弹夹,先进后出,后进先出.
    为什么main()最先执行,最后结束?
    main()最先压入栈里,最后出栈.

    • 栈内存
      主管程序的运行,生命周期和线程同步.线程结束,栈内存也就释放了.
      故不存在垃圾回收
    • 存放的东西
      8大基本类型,对象引用,实例的方法.
    • 栈运行原理
      栈帧
    • 栈、堆、方法区调用关系

    栈内存溢出

    public class JvmTest2 {
    
        public static void main(String[] args) {
            new JvmTest2().getM1();
            //反复调用
        }
    
        void getM1(){
            getM2();
        }
    
        void getM2(){
            getM1();
        }
    }
    

    运行结果java.lang.StackOverflowError

    Exception in thread "main" java.lang.StackOverflowError //stack溢出错误
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    	at cn.yang37.jvm.test.JvmTest2.getM1(JvmTest2.java:16)
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    	at cn.yang37.jvm.test.JvmTest2.getM1(JvmTest2.java:16)
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    	at cn.yang37.jvm.test.JvmTest2.getM1(JvmTest2.java:16)
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    	at cn.yang37.jvm.test.JvmTest2.getM1(JvmTest2.java:16)
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    	at cn.yang37.jvm.test.JvmTest2.getM1(JvmTest2.java:16)
    	at cn.yang37.jvm.test.JvmTest2.getM2(JvmTest2.java:20)
    

    执行过程大致如下

    10.堆

    11.三种JVM
    12.新生区、老年区
    13.永久区
    14.堆内存调优
    15.GC

    • 引用算法
    • 复制算法
    • 标记清除算法
    • 标记压缩算法

    16.JMM
    Java内存模型,不是JVM.

  • 相关阅读:
    flutter 报错DioError [DioErrorType.DEFAULT]: Error on line 1, column 17: Invalid media type: expected no more input.
    flutter 报错 DioError [DioErrorType.DEFAULT]: Bad state: Insecure HTTP is not allowed by platform
    什么是负载测试?什么是性能测试?
    性能测试包含了哪些测试(至少举出3种)
    简述使用Loadrunner的步骤。
    什么时候可以开始执行性能测试?
    apache ab压力测试工具
    webbench 的安装以及使用
    python3 django 电影网站项目
    音乐网站 前端html5模版
  • 原文地址:https://www.cnblogs.com/yang37/p/12809862.html
Copyright © 2020-2023  润新知