JVM必懂知识点-后台面试(自用笔记,更新中)

1. JVM模型

  字节码文件先通过类装载子系统装载到运行时数据区(内存区域),然后由执行引擎执行字节码文件。

  堆:new出来的对象一般都在堆上

  栈(线程栈,虚拟机栈):栈是每一个线程独享的,每一个线程都会有一个自己的栈。主要存放线程执行过程中的局部变量,一个方法对应一个栈帧内存区域,栈帧内存区域还包括局部变量表,操作数栈,动态链接,方法出口。比如a=2;首先把a放到局部变量表,然后把2放到操作数栈,然后把2放到局部变量表的a上,使得a=2。且每个线程都有自己的程序计数器,用来指示将要执行的下一行代码。动态链接表示通过对象的头指针找到调永方法的对应指令码的地址,这个内存地址就是动态链接。方法出口放的是程序应该返回的代码地址。如果局部变量是new出的一个对象,那么对象在堆里,栈帧中局部变量存放的是对象的地址指针(栈和堆的关联)。

  本地方法栈:

  方法区:类的字节码文件被类装载子系统装载到方法区,方法区一般存放常量+静态变量+类元信息(类的结构信息,比如类有啥常量,啥方法),比如a.b(),通过a到类元信息,然后调用a的b方法。

 

2. 垃圾回收, 垃圾回收触发条件,Minor GCFull GC

  新建对象会放到eden区,当eden区放满时,则执行minorGC,常见的垃圾回收算法为可达性分析,从GcRoot根开始进行可达性分析,如果没有在jcroot根的链条上,即目前没有被使用,则是垃圾对象,当然并不是直接回收,还要看此对象是否有必要执行finalize()方法,如果没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用,则直接回收,否则把对象放到队列里,然后进行第二次标记,如果对象要在finalize()中拯救自己,比如与gcRoot建立连接,那么就不回收,否则回收。

  Minor GC:eden园满时进行minorGC,然后将Eden区存活的对象放到from区,分代年龄+1,下次eden区满时,再次进行minorGC,将Eden和from区的存活对象放到to区(survive区分为from 和to),分代年龄+1.当分代年龄到达15时,则讲对象

  Full GC:老年代满时,进行fullGC,尝试收集整个堆的垃圾对象,无法回收则溢出,否则进行垃圾收集,fullGC过程中会停掉应用线程,也就是Stop The World(minorGC也会STW,但是很快,影响不大),java虚拟机调优的目的就是减少FullGC

3. 常见的垃圾回收算法

4. JVM调优

  在垃圾回收过程中,会进行对象动态年龄判断,如果一批对象的总大小大于survivor区域的50%,则直接把这批对象放到老年代,如图情况,eden区满了之后,活的对象大于survivor区容量的50%,则直接放到老年代,很短时间就会触发FullGC,所以可以加大survivor区域。

 

JMM内存模型

方法里的变量,在JVM哪个区,对象在哪个区

猜你喜欢

转载自blog.csdn.net/zhangzulin1234/article/details/108309312
今日推荐