描述一下Java堆内存划分,再解释Minor GC,Major GC,Full GC,描述它们之间转化流程.
Java堆 = 老年代 + 新生代
新生代 = Eden + S0 + S1
当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区.
大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态;
如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态.
老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代.
Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上.
MaxTenuringThreshold=15 作为默认值,当这个值设置的过小,则导致老年代空间被频繁占用,内存不够则触发Full GC.
当这个值设置过大,则对象在两个Survivor及Eden区来回波动.
Young GC的触发原因都是eden区满了;
Major GC触发原因都是老年代空间满了;
Full GC触发原因:
Survivor区空间不是很大,在一次垃圾回收之后, Eden区会将超过年龄限制的对象送入老年代, 剩下的存活对象存入Survivor区. 如果Survivor区存不下,则会提前将对象存入老年代(走空间担保流程).
Survivor区的作用:
1. 复制算法会比整理算法效率高, 从Eden复制到Survivor区可以减少碎片. 如果没有Survivor区或者只有一个Survivor区,那么在垃圾回收时会有很多碎片(自己理解下).
空间担保流程失败:
youngGC存活的对象超过老年代的空间;
直接进入老年代的对象:
典型的垃圾收集器,尤其cms和G1,它们的原理与区别,涉及的垃圾回收算法.
1)几种垃圾收集器:
Serial收集器: 单线程的收集器,收集垃圾时,必须stop the world,使用复制算法.
ParNew收集器: Serial收集器的多线程版本,也需要stop the world,复制算法.
Parallel Scavenge收集器: 新生代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个可控的吞吐量。如果虚拟机总共运行100分钟,其中垃圾花掉1分钟,吞吐量就是99%.
Serial Old收集器: 是Serial收集器的老年代版本,单线程收集器,使用标记整理算法.
Parallel Old收集器: 是Parallel Scavenge收集器的老年代版本,使用多线程,标记-整理算法.
CMS(Concurrent Mark Sweep) 收集器: 是一种以获得最短回收停顿时间为目标的收集器,标记清除算法,运作过程:初始标记,并发标记,重新标记,并发清除,收集结束会产生大量空间碎片.
G1收集器: 标记整理算法实现,运作流程主要包括以下:初始标记,并发标记,最终标记,筛选标记。不会产生空间碎片,可以精确地控制停顿.
2)CMS收集器和G1收集器的区别:
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用;
G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
CMS收集器以最小的停顿时间为目标的收集器;
G1收集器可预测垃圾回收的停顿时间
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片
jvm本地方法棧
java方法要调用C/C++方法,那么C/C++方法,就称之为本地方法;
调用java方法,虚拟机栈会压栈;但是调用本地方法,不会入虚拟机栈,但是会入本地方法栈;
AQS中的cas操作相关的unsafe类方法也属于本地方法;
参考: 常见JVM面试题及答案整理_Java笔记-CSDN博客_jvm面试题
常见JVM面试题及答案整理_Java笔记-CSDN博客_jvm面试题
jvm的三种算法以及10种垃圾收集器_li646495946的博客-CSDN博客_jvm算法
5. Java中可以作为GC Roots的对象
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(即一般说的native方法)中引用的对象
6. 方法区
方法区存放java class类信息, 常量信息,枚举, 静态变量,即使编译器编译的代码等;
JDK1.8以后,元空间包含了方法区. 元空间与永久代很重要的区别是元空间大小不在虚拟机设置的大小范围内;
7. 元数据区与永久代对比
- 由于永久代的垃圾回收和老年代的垃圾回收是绑定的,一旦其中一个区域被占满,这两个区都要进行垃圾回收,增大了OOM发生的概率
- 元空间大小不属于虚拟机内存的一部分,但是永久代属于虚拟机内存一部分;
查询某个配置的属性值:
jinfo -flag MaxTenuringThreshold 52743
Jvm command
jmap -histo:live pid
查看存活的对象
jinfo pid, 查看jvm配置信息
线程的状态:
CPU状态:
jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
option参数如下:
类型 内容 说明
类装载相关 -class 显示ClassLoader的相关信息:类的装载卸载数量、总空间、类装载消耗的时间等
垃圾回收相关 -gc 显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gccapacity- 显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil 显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因
-gcnew 显示新生代GC状况
-gcnewcapacity 显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold 显示老年代GC状况
-gcoldcapacity 显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity 显示永久代使用到的最大、最小空间
JIT相关 -compiler 显示JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法
参考:
https://www.cnblogs.com/wsx2019/p/15794952.html