一、基本概念:
JVM 是可运行 Java 代码的假想计算机 ,包含一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储办法域。JVM 是运行在操作系统之上的,它与硬件没有间接的交互。
二、 架构:
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工夫会短一些