JDK1.6、JDK1.7、JDK1.8 内存模型演变
JDK 1.6:有永久代,静态变量存放在永久代上。
JDK 1.7:有永久代,但已经把字符串常量池、静态变量,存放在堆上。逐渐的减少永久代的使用。
JDK 1.8:无永久代,运行时常量池、类常量池,都保存在元数据区,也就是常说的元空间。但字符串常量池仍然存放在堆上。

Java虚拟机栈
每一个方法在执行的同时,都会创建出一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口、线程等信息。方法从调用到执行完成,都对应着栈帧从虚拟机中入栈和出栈的过程。最终,栈帧会随着方法的创建到结束而销毁。

堆和元空间
在 JDK 1.8 之后就不在堆上分配方法区了,元空间从虚拟机Java堆中转移到本地内存,默认情况下,元空间的大小仅受本地内存的限制,说白了也就是以后不会因为永久代空间不够而抛出OOM异常出现了。jdk1.8以前版本的 class和JAR包数据存储在 PermGen下面 ,PermGen 大小是固定的,而且项目之间无法共用,公有的 class,所以比较容易出现OOM异常。

JDK内存模型演进与Java虚拟机栈堆元空间解析
本文介绍了JDK1.6至1.8内存模型的变化,包括永久代到元空间的转变,以及字符串常量池的位置。JDK1.6中永久代存储静态变量,1.7开始减少其使用,1.8则完全移除,运行时常量池和类常量池存入元空间。此外,详细阐述了Java虚拟机栈的每个方法执行时创建的栈帧,以及堆和元空间的内存分配情况,1.8以后元空间不再受限于Java堆,减少了OOM异常的发生。
2208

被折叠的 条评论
为什么被折叠?



