JVM

一、基本概念:

JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、
一个垃圾回收,堆和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接
的交互。

二、 架构:
JVM_第1张图片

JVM分为五大模块: 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块 。

三、 内存区域:
1、线程私有:

(1)栈:描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)、用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
(2)本地方法栈
(3)程序计数器
   当前线程所执行的字节码的行号指示器
   这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。

2、线程公有:

(4)堆:从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。
(5)方法区(也叫永久代,java8后改为元空间):
   用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

3、直接内存。

四、Minor GC(或Young GC)、Major GC、Full GC

  我们需要尽量的避免垃圾回收,因为在垃圾回收的过程中,容易出现STW(Stop the World)的问题。
  JVM在进行GC时,并非每次都对上面三个内存( 新生代、老年代、方法区 )区域一起回收的,大部分时候回收的都是指新生代。
新生代收集( Minor GC/Young GC ):只是新生代( Eden、S0/S1 )的垃圾收集
老年代收集( Major GC/Old GC ):只是老年代的垃圾收集。
目前,只有CMS GC会有单独收集老年代的行为 。也就是说其它GC执行Major GC的时候可不会只收集老年代的垃圾。
注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为。
整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。
补充说明

触发Minor GC执行的情况有哪些?

当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden区满,Survivor区满不会触发GC。会有STW
出现了MajorGc,经常会伴随至少一次的Minor GC
也就是在老年代空间不足时,会先尝试触发Minor GC,如果之后空间还不足,则触发Major GC

触发Full GC执行的情况有哪些?

调用System.gc( )时,系统建议执行Full GC,但是不必然执行
老年代空间不足
方法区空间不足
通过Minor GC后进入老年代的平均大小 大于 老年代的可用内存。如果允许担保并担保成功暂时不触发,到老年代空间不足再触发。不允许担保则直接触发。
说明:Full GC 是开发或调优中尽量要避免的。这样STW时间会短一些

你可能感兴趣的:(jvm)