JVM知识点整理

JVM知识点整理

  1. 描述一下JVM内存结构
  2. 每个区的作用是什么?
  3. 堆内存的工作原理是什么?为什么需要两个Survivor区?只有一个行不行?
  4. 老年代使用什么垃圾回收算法?

JVM内存结构

JVM在执行Java程序的过程中会把它管理的内存划分成若干不同的数据区域。分析JVM内存结构就是分析JVM运行时数据存储区域

JVM运行时的数据区主要包括:堆、虚拟机栈、方法区、程序计数器、本地方法栈

JVM内存结构

1、堆(GC区)

线程共享
堆是JVM管理内存中最大的一块内存区域,堆内存被所有线程共享,主要存档new关键字创建的对象,所有对象实例以及数组都要在堆上分配空间。
垃圾收集器就是根据GC算法,收集堆上所占用的内存空间(收集的是对象占用的内存空间而不是对象本身)。
堆分为年轻代(Yong Generation)和老年代(Old Generation),年轻代又分为伊甸园区(Eden)和幸存区(Survivor),幸存区又分为From Survivor(S0)和To Survivor(S1)空间。

新创建的对象存储在年轻代中,当年轻代存满之后,会触发Minor GC,清理年轻代内存空间。
老年代存储长期存活的对象和大对象。年轻代中存储的对象经过多次GC依然存活的对象会移动到老年代存储。老年代存满之后会触发FULL GC。

Minor GC发生在Eden区
Yong GC发生在Eden、S0、S1区
Major GC发生在Old区
FULL GC是清理整个堆空间,包括年轻代和老年代
如果FULL GC之后堆中仍然无法存储对象,而且堆无法扩展,就发抛出OutOfMemoryError(OOM)错误

(1)堆空间比例
默认的,年轻代和老年代的空间比例是1:2,可以通过-XX:NewRatio配置;
默认的,Eden:S0:S1=8:1:1,可以通过-XX:SurvivorRadio配置;
默认的,Survivor中对象被复制的最大次数为15次,可以通过-XX:Max Tenuring Threshold配置;

(2)为什么年轻代要分成Eden区和Survivor区,为什么要设置两个Survivor区

  1. 如果没有Survivor区,Eden每进行一次Minor GC,存活的对象就会被送入老年代,老年代很快就被填满,接着触发Major GC(因为Major GC一般伴随着Minor GC,也可以看成触发了FULL GC)。由于老年代空间远大于年轻代,每进行一次FULL GC消耗的时间比Minor GC长的多,影响程序执行、响应速度,所以要区分Eden区和Survivor区。
  2. Survivor区存在的意义就是减少被送到老年代的对象,进而减少FULL GC的发生,Survivor的预筛选保证只有在Survivor经历15次复制还能在年轻代存活的对象才会被送到老年代。
  3. 设置两个Survivor最大的好处就是减少了空间碎片化。如果只有一块Survivor区,就会产生下图这种情况(色块代表对象占用了的空间)。如果Eden存满了,Survivor中存了一部分的对象,由于Eden满了所以会触发Minor GC,Eden和Survivor中都有一部分的对象存活,接着把Eden中存活的对象转移到Survivor中,就会导致空间碎片化。
    在这里插入图片描述
    如果有两块Survivor,假设Eden存满了,S0中有一部分的对象,由于Eden存满触发Minor GC,Eden中存活的对象以及S0中存活的对象会被复制到S1中(S1放不下就放到老年代),Eden以及S0被清空。这样就保证了Survivor中不会空间碎片化。
    在这里插入图片描述

2、虚拟机栈

线程私有
是描述java方法执行的内存模型。
用于存储局部变量表、操作数栈、动态链接、方法出口等信息(存储临时变量、基本数据类型、对象的引用地址、方法出口等)。

3、方法区

线程共享
存放已被加载的类的信息、常量、静态变量、即时编译器编译的代码数据等(jdk7以前称为永久代、jdk8之后把它改为元数据空间)。回收目标主要是常量池的回收和类型的卸载。

4、程序计数器

线程私有
当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址(存储程序当前运行的位置)。
为了线程切换可以恢复到正确的位置,每个线程都有独立的程序计数器,不同线程的程序计数器互不影响,独立存储。
如果线程执行java方法,程序计数器记录的是正在执行的虚拟机字节指令地址;如果执行的Native方法,计数器值为Undefined。

程序计数器这块内存区域是虚拟机规范中唯一没有OOM的区域。

5、本地方法栈

线程私有
和虚拟机栈相似,只不过它服务于Native方法。

参考:
JVM内存结构
深入理解JVM-内存模型(jmm)和GC
一文搞懂JVM内存结构
为什么新生代内存需要有两个Survivor区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值