Jvm内存区域 - 《深入理解Java虚拟机》ch02笔记

时间:2022-12-28 07:41:51

一、JVM运行时内存区

1. 程序计数器

Java虚拟机规范唯一不会发生OOM的区域


2. Java虚拟机栈

提供Java方法执行的内存模型,就是“栈帧”,方法的执行就是栈帧在虚拟机栈中的入栈与出栈过程。此区域是线程私有的,直白的说就是每个线程有自己的虚拟机栈,互不影响。可能会抛出*Error或OutOfMemoryError。


本地方法栈

和Java虚拟机栈几乎完全相同的功能,只是用于执行非Java的native代码,Java虚拟机规范没有规定实现方式,所以对于HotSpot虚拟机来说,Java虚拟机栈和本地方法栈是同一块区域。


内存配置:Java虚拟机栈和本地方法栈分别通过-Xss和-Xoss配置


3. Java堆

是JVM内存管理最大的一块,是所有线程共享的,且可扩展(-Xms和-Xmx控制)。对象在此区域分配,为了GC,一般再次划分为老年代与新生代。


内存配置:-Xms和-Xmx


4. 方法区

方法区和Java堆一样,是线程共享的。用于存储,类信息、常量、静态变量等,也需要进行GC。在HotSpot虚拟机来说,使用永久代方式实现内存回收,这样就能够按照Java堆的方式回收方法区内存。但是这种方式会被渐渐取代,JEP-122,而且在JDK1.7中的JVM中,已经将常量池从此区域移除。


运行时常量池

是方法区的一部分,用于存储Class中的常量池信息,是动态的,不一定在编译时产生,运行期间也可能将新的常量放入到常量池中,如:调用String类的intern()方法


内存配置:-XX:PermSize和-XX:MaxPermSize


二、直接内存

JDK1.4 中NIO(New Input/Output)可以使用Native函数库分配额外的内存,这样在某些场景能显著提高性能。分配内存时需要考虑此区域的内存需求,而且也可能出现OOM。


内存配置:-XX:MaxDirectMemorySize指定,不指定默认和Java堆最大值(-Xmx指定)相同