首页 > 应用开发 > > JVM内存布局《码出高效》
JVM内存布局
JVM 内存布局示意图
1. Heap 堆区
Heap 是OOM 故障最主要的发源地,它存储着集合所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用。
堆分为2大块:新生代和老年代
对象产生之初在新生代,步入暮年时,进入老年代,但是老年代也接纳在新生代无法容纳的超大对象。
2. Metaspace 元空间
区别于永久代,元空间在本地内存中分配。
方法区(Method Area)也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
元数据—instanceKlass 对象会存在元空间(方法区),而对象实例—— instanceOopDesc 会存在Java堆。Java虚拟机栈中会存有这个对象实例的引用。
3. JVM Stack 虚拟机栈
JVM 中的虚拟机栈是描述Java 方法执行的内存区域,它是线程私有的。
栈帧在整个JVM 体系中的地位颇高,包括局部变量表、操作栈、动态连接、方法返回地址等。
StackOverflowError 表示请求的栈溢出,导致内存耗尽,通常出现在递归方法中。
4. Native Method Stacks 本地方法栈
在JVM 内存布局中,也是线程对私有的。本地方法栈为 Native 方法服务。
对于内存不足的情况,本地方法栈还是会抛出 native heap OutOfMemory。
5. Program Counter Register 程序计数寄存器
程序计数器在各个线程之间互不影响,此区域也不会发生内存溢出异常。
从线程共享的角度来看,堆和元空间 -- 是所有线程共享的,而虚拟机栈、本地方法栈、程序计算器 --- 是线程内部私有的。
Java 的线程与内存区域
绿色方框:线程共享
紫色方框:线程私有
红色方框:可能出现的异常类型
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/835/viewspace-3163251/ ,如需转载,请注明出处,否则将追究法律责任。