内存简介:
JVM架构图
-
Runtime Data Area
- Stack:堆栈
- Heap:堆
- Method Area:方法区
- PC Register:程序计数器
- Native Method Stack:本地方法栈
JDK8 - JVM 内存模型:
-
线程私有:
- 程序计数器(字节码指令 no OOM)
- 虚拟机栈(java方法 SOF& OOM)
- 本地方法栈(native方法 SOF & OOM) 线程共享:
- MetaSpace(元空间)(类加载信息 OOM)
- 堆(数组和对象 OOM) { 常量池(字面量和符号引用面量)
程序计数器(program counter Register)
1)当线程所执行的字节码行号指示器(逻辑)
2)改变计数器的值来选取下一条需要执行的字节码指令
3)和线程是一对一的关系即“线程私有”
4)对java方法记数,如果是native方法则计数器值为undefined
5)不会发生内存泄漏
java虚拟机栈()stack
java方法执行的内存模型
包含多个栈帧
局部变量:包含方法执行过程中的所有变量
操作数栈:入栈,出栈,复制,交换,产生消费变量
-
递归为什么会引发 java.lang.stackOverflowError异常
- 递归过深,栈帧数超出虚拟机栈深度
本地方法栈
与虚拟机栈相似,主要作用于标注了native的方法
元空间(MetaSpace)与永久代(PermGen)的区别
元空间使用本地内存,而永久代使用的是jvm的内存
-
MetaSpace相比PermGen的优势
-
字符串常量池存在永久代中,容易出现性能问题和内存溢出
类和 方法的 信息大小难以确定,给永久代的大小指定带来困难
永久代会为GC带来不必要的复杂性
方便HotSpot(虚拟机)与其他JVM入Jrockit的集成
Java堆(GC堆):存储对象实例,GC管理的主要区域
对象实例的分配区域
GC管理的主要区域
Java7 原先位于方法区里的字符串常量池,已被移动到Java堆中
JDK8 使用元空间替代了永久代