Java内存模型
Java内存模型(JDK8)
程序计数器:(Program Counter Register)
当前线程所执行的字节码行号指示器(逻辑)
改变计数器的值来选取下一条需要执行的字节码指令
和线程是一对一的关系即“线程私有”
对Java方法计数,如果是Native方法则技术器的值为Undefined
不会发生内存泄露
Java 虚拟机栈(Stack)
Java方法执行的内存模型
包含多个栈帧
递归为什么会引发java.lang.StackOverflowError 异常
递归过深,栈帧数超过虚拟机深度
虚拟机栈过多,会引发java.lang.OutOfMemoryError异常
元空间(MetaSpace)与永久代(PermGen)的区别
元空间使用本地内存,而永久代使用JVM内存
java.lang.OutOfMemoryError:PermGen space
MetaSpace相比PermGen的优势
- 字符串常量池存在永久代中,容易出现性能问题和内存溢出。
- 列和方法的信息大小难以确定,给永久代的指定带来困难。
- 永久代会为GC带来不必要的复杂性。
Java堆(Heap)
对象实例的分配区域
GC管理的主要区域
1.新生代:Eden+From Survivor+To Survivor
2.老年代:OldGen
3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)
常见问题
JVM 三大性能调优参数 -Xms -Xmx -Xss的含义
-Xss : 规定了每个线程虚拟机栈(堆栈)的大小,256k一般足够,影响此进程中,并发线程数的大小。
-Xms: 堆的初始值
-Xmx: 堆能达到的最大值
Java内存模型中堆和栈的区别 - 内存分配策略
静态存储: 编译时确定每个数据目标在运行时的存储空间需求
栈式存储: 数据区需求再编译是未知,运行时模块入口确定
堆式存储:编译时或运行时模块入口都无法确定,动态分配。
联系: 引用对象、数组时,栈里定义变量保存堆中目标首地址
感谢观看,感谢支持。