2020-09-23


一、jvm内存模型

2020-09-23

这是jdk1.8的jvm内存模型,之前的方法区,永久代已经被优化

1.程序技术器区

每个线程一块内存,指向当前正在执行的字节码的行号。如果当前线程是native方法,则其值为null。

2.java虚拟机栈

2020-09-23
java虚拟栈是java方法使用的,每个java方法被调用时就会在这里创建一个栈,然后入栈,栈是先进后出,然后栈的长度是有限制的太深了会抛出StackOverflowError,或者请求不到内存了OutOfMemoryError。

3.本地方法栈

和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。

4.堆

唯一的用途就是存放对象实例:所有的对象实例以及数组都在堆上进行分配。堆时JVM内存占用最大,管理最复杂的一个区域。分成新生代和老年代。(下面有详细介绍堆的)

5.元数据区

存放虚拟机加载的类信息,静态变量,常量等数据。本质就是取代以前的方法区,是方法区的实现。

6.直接内存

JDK 1.4引入了NIO,使用Native函数库直接分配堆外内存。

二、堆的解析

2020-09-23
此区域唯一的目的就是存放对象实例。Java堆是内存回收的主要区域(GC堆)。从内存回收的角度来看,java堆可以细分为新生代和老年代。
老年代:2/3的堆空间
新生代:1/3的堆空间
eden区:8/10的新生代空间
survivor 0:1/10的新生代空间
survivor 1:1/10的新生代空间
而堆信息的升级转化,每次使用Eden和其中一块Survivor(两个Survivor区域一个称为From区,另一个称为To区域)。每次GC(垃圾回收算法)会清理新生代90%的区域也就是会剩下1个survivor不清理(为什么会剩呢,因为经过GC后剩下的对象实例会复制到这个空的survivor,而空的空间当然不需要GC)