1、自动内存管理机制-Java内存区域

1、运行时数据区域

1.1 程序计数器

程序计数器:当前线程所执行的字节码指示器。字节码解释器根据这个计数器的值来选取下一条需要执行的字节码指令。

线程私有的内存区域。唯一不会出错OutOfMemoryError。

执行的指令分为几种:
1)java方法:计数器记录的是正在执行虚拟机字节码指令的地址;
2)Native方法:计数值为空。

1.2 Java栈

也是线程私有的,它的生命周期跟线程相同
Java栈描述的是java方法执行的内存模型,用于存储局部变量表、操作数栈、动态链接等。

两种可能的异常:
1)如果线程请求的栈深度大于jvm栈所允许的深度,将抛出StackOverflowError;
2)如果jvm可以动态扩展,在扩展时无法申请到足够的内存,抛出OutOfMemoryError.

通过-Xss设置大小。

1.3 本地方法栈

本地方法栈跟Java栈相似,只是它用于调用navtive方法使用,也是线程私有的,也可能抛出两种错误。

1.4 Java堆

Java堆是被所有线程共享的,在jvm启动时创建。唯一目的是存放对象实例。
Java堆是垃圾回收器管理的主要区域。
分代算法:新生代和老年代。 新生代:Eden、From Survivor、To Survivor。
Java堆可以是物理不连续的内存空间。主要通过-Xmx和-Xms控制。
如果堆空间不够时可能会抛出OutOfMemoryError。

1.5方法区

方法区是被所有线程共享的。存储已加载的类信息、常量、静态变量、即时的代码等。
在HotSpot中方法区也叫永久代(物理内存)。
该 区域的垃圾回收主要在对常量池和类型的卸载。
如果方法区无法内存分配时,会抛出OutOfMemoryError。
通过-XX:PermSize和-XX:MaxPermSize设置大小。

1.6 运行时常量池

编译时:字面量和符号引用
运行时:String的intern()方法

1.7 直接内存

NIO引用的方法,可以直接读取物理内存,不受jvm管控。

2、HotSpot JVM对象

2.1 对象创建

类加载-》分配堆内存-》初始化为零值-》对象头设置-》执行init方法

2.2 对象的内存布局

分为3块:对象头、实例数据、对齐填充
对象头:运行时数据和类型指针。

2.3 对象的访问定位

通过栈的reference:句柄和直接指针

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章