探究JVM

JVM

  java虚拟机的缩写,是一个虚构的虚拟机

组成:

  ·类装载器: 用来装载.class 文件

  ·执行引擎: 执行字节码文件或者执行本地方法

  ·运行时数据区: 

    ~方法区:     

      线程共享
      存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码
      GC少见

    ~堆: 

      线程共享内存区
      虚拟机启动时创建
      存放对象实例
      可以处于逻辑上连续 物理上不连续的内存空间
      可以固定大小,也可以用作扩展

    ~栈:

      线程私有,生命周期与线程相同
      线程创建的同时同时会创建JVM栈
      方法调用完成的过程就是栈帧从虚拟机入栈到出栈的过程
      局部变量表所需要的内存在编译时分配
      栈可以存放的基础数据类型:(int long double float short byte char boolean)
      栈溢出:
        条件:栈深度大于虚拟机允许的深度
        解决办法: 1、调整线程栈的大小 2、越大线程总数越少 3、越少线程总数越大   

    ~PC寄存器:
      存储每个线程下一步执行的JVM指令
      如果该方法为native方法,PC寄存器不会存储信息
    ~本地方法栈:
      执行虚拟机用到的native方法。
      与虚拟机的区别:本地方法栈是给虚拟机用的;虚拟机栈是给Java程序用的

  ·GC(垃圾回收模块):
    方式: 复制删除法;标记删除法;标记整理法
    gcroot:
      gc的类:
        废弃的常量
        无用的引用
        无用的类(所有的实例都被回收;classload已被回收、没有任何地方引用、无法通过反射访问)
      不gc的类:
        虚拟机栈中的引用对象
        方法区: 类变量、常量
        本地方法栈中的对象引用
  ·jvm三种加载类:
    home: java.lang
    ext: 自主体
    y应用程序加载器
  ·java程序的执行过程:
    1.加载类 获取类的二进制字节流,将其转换为方法区的运行时数据结构
    2.分配内存 校验文件格式,元数据验证,字节码验证,符号引用验证
    3.初始化数据
      在方法区中对类的static变量分配内存并设置变量数据默认值
      不包括变量实例,实例变量会在对象实例化的时候一起分配到java堆中
    4.设置对象头 将常量池中内的符号引用替换成直接引用的过程
    5.执行init方法 为类的静态变量赋予正确的初始值

原文地址:https://www.cnblogs.com/joey-413/p/13976614.html