内存管理领域
虚拟机自动内存管理机制
内存泄露和内存溢出
一旦出现问题 , 排查错误
虚拟机是怎样使用内存
-----------------------------------------------------------------------------------------------------------------------------------------------------
java虚拟机的运行时数据区:虚拟机的内存概况,内存中放了些什么
1.程序计数器
2.java虚拟机栈
3.本地方法栈
4.java堆
5.方法区
6.运行时常量池
7.直接内存
-----------------------------------------------------------------------------------------------------------------------------------------
虚拟机内存中的数据是如何创建,如何布局以及如何访问,限定区域,使用优先
常用的虚拟机HotSpot
常用的内存区域Java堆
1.对象的创建:
new指令
类加载检查
为新生对象分配内存 , java堆
java堆规整:指针碰撞(Bump the Pointer)
java堆不规整:空闲列表(Free List)
取决于垃圾收集器
对象创建在虚拟机中是非常频繁的行为:线程不安全
2.对象的内存布局:
对象头Header
实例数据Instance Data
对齐填充padding
3.对象的访问定位:建立对象是为了使用对象
通过句柄访问对象
通过直接指针访问对象
-------------------------------------------------------------------------------------------------------------------------------------------
除了程序计数器外,其他的区域都有可能发生
OutOfMemoryError异常
OOM
内存溢出异常
1.java堆溢出
分清楚到底出现内存泄露Memory Leak 还是内存溢出Memory Overflow
2.虚拟机栈和本地方法栈溢出
在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈
stackoverflowerror,单线程下,都是抛出这个异常
outofmemoryerror
3.方法区和运行时常量池溢出
运行时常量池是方法区的一部分
4.本机直接内存溢出
总结:
虚拟机中的内存是如何划分的
各个区域出现内存溢出异常的原因
下一章java垃圾收集机制为我们避免产生内存溢出异常做的努力