2020-09-23
一、jvm内存模型
这是jdk1.8的jvm内存模型,之前的方法区,永久代已经被优化
1.程序技术器区
每个线程一块内存,指向当前正在执行的字节码的行号。如果当前线程是native方法,则其值为null。
2.java虚拟机栈
java虚拟栈是java方法使用的,每个java方法被调用时就会在这里创建一个栈,然后入栈,栈是先进后出,然后栈的长度是有限制的太深了会抛出StackOverflowError,或者请求不到内存了OutOfMemoryError。
3.本地方法栈
和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。
4.堆
唯一的用途就是存放对象实例:所有的对象实例以及数组都在堆上进行分配。堆时JVM内存占用最大,管理最复杂的一个区域。分成新生代和老年代。(下面有详细介绍堆的)
5.元数据区
存放虚拟机加载的类信息,静态变量,常量等数据。本质就是取代以前的方法区,是方法区的实现。
6.直接内存
JDK 1.4引入了NIO,使用Native函数库直接分配堆外内存。
二、堆的解析
此区域唯一的目的就是存放对象实例。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)