jvm内存模型及调优

JVM内存模型

jvm内存模型及调优_第1张图片

  • 运行流程:
    java文件经过编译后的字节码文件,通过类装载子系统加载到jvm的虚拟机中。
  1. 栈,在程序运行时,会给运行的线程分配专属的空间来存放局部变量。那么栈的是如何存放局部变量的呢?在栈中又含有栈帧(在运行到线程中的不同方法时,会给该方法分配一个独立的内存区域,来存放该方法的局部变量;即一个方法对应一块栈帧内存区域),每个栈帧中分别含有局部变量表,操作数栈,动态链接,方法出口;其中局部变量表是存放方法中的局部变量,操作数栈是用来临时存放操作数,方法出口是用来记录执行完当前方法之后,会继续执行哪一行代码。栈中的局部变量表中的局部变量如果是一个对象,则其中存放的只是一个内存地址,指向的是堆中新建的对象。
  2. 方法区中有常量池,静态变量,类信息等。其中静态变量如果也是引用类型的话,那么方法区中存放的也只是一个引用地址而已,新建的对象会在堆中开辟空间存储
  3. 本地方法栈是在线程中,如果会执行本地方法,那么其中的局部变量等存储空间会在本地方法栈当中
  4. 程序计数器是用来记录线程执行指令所执行到的位置,是由字节码执行引擎修改。作用:当该线程被挂起而实行其他线程之后,再回到此线程,就从程序计数器所记录的位置开始执行代码

jvm内存模型及调优_第2张图片

  • 堆中的存储对象处理流程:
  1. 新建的对象都会存储在Eden区当中,当Eden区存储空间不足的时候,字节码执行引擎会开启一个后台线程执行minor gc进行垃圾对象收集(垃圾对象的收集区域包括Eden区和Suvivor区)。对于非垃圾对象,会将其放到Survivor区,并将其分代年龄加1。
  2. 当对象的分代年龄达到15(默认是15)的时候,会将其放到老年代中。
  3. 当老年代中的存储空间不足时,会执行full gc进行垃圾对象收集,收集的区域是整个堆。在每一次垃圾对象收集的时候,都会暂停用户的进程(STW,Stop Work),极其影响用户体验,minor gc由于收集的区域较小,所以STW的时间很短,不太影响体验。所以JVM调优的目的就是减少full gc的次数

垃圾对象的判别
jvm内存模型及调优_第3张图片

调优

jvm内存模型及调优_第4张图片
在这里插入图片描述
如果有一批即将放到survivor区的对象的总大小大于这块survivor区大小的50%,则会直接将此批对象放到老年代。

如果此批对象只需过一会就会变成垃圾对象,那么我们根本就不想让这些对象进入老年代,我们想通过执行minor gc就将这批对象销毁,所以我们进行调优的时候,可以将年轻代的大小设置的大一些。则此时这批对象会放到suvivor区而不是老年代,就可以通过minor gc来进行回收了。

你可能感兴趣的:(jvm)