JVM内存结构
2011-10-26 14:27
351 查看
JVM内存结构
JVM将内存空间划分为:方法区、堆、本地访法栈、PC寄存器和JVM方法栈◆方法区
一个JVM只存在一个方法区,所有线程共享;
类的信息(类的完整有效名称、父类的完整有效名称<interface 与 Object除外>、修饰符等);
类中的静态变量;
类中定义为final的常量;
类中的Field信息(域名、域类型和域修饰符等);
类中的方法信息(方法名、方法返回类型、方法参数、方法的修饰符、方法的字节码等);
方法区也可以被GC;
方法区的内存大小默认最小16MB,最大64MB,可通过-XX:PermSize及-XX:MaxPermSize来指定最小最大值;
◆堆
一个JVM只存在一个堆,所有线程共享;
类的实例和数组;
堆的内存大小默认最小值为物理内存的1/64(<1GB),最大值为物理内存的1/4(<1GB),可通过-Xms和-Xmx来指定其最大最小值;
当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定此比例;
当空余堆内存大于70%时,JVM会减小Heap到-Xms指定的大小,可通过-XX:MaxHeapFreeRatio=类指定此比例;
为了使内存回收更高效,从JDK1.2开始对堆采用分代管理;
新生代(New Generation):一般来说,Java程序中新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survisor Space(又称为S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的内存大小,也可以通过-XX:SurvisorRatio来调整Eden Space和Survisor Space的大小;
老生代(Old Generation):用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新创建的对象也有可能在老生代上直接分配内存,主要有两种情况(由不同的GC实现来决定):一种为大对象,可通过-XX:PretenureSizeThreshold=1024(单位是字节,默认为0)来代表当对象超过多大时就不在新生代中分配内存,而是直接在老生代中分配,此参数在新生代采用Parallel Scavenge GC时无效,Parallel Scavenge GC会根据运行状况决定什么对象直接在老生代中分配内存;另一种为大的数组对象,且数组中无引用外部对象;
老生代所占用的内存大小为-Xmx对应的值减去-Xmn对应的值;
◆本地方法栈
用于支持native方法的执行,存储每个native方法调用的状态;
JDK中本地方法栈和JVM方法栈是同一个;
◆PC寄存器和JVM方法栈
每个线程都会创建PC寄存器和JVM方法栈;
JVM方法栈只有“压栈”和“出栈”操作,操作的单位是栈帧,其中栈帧由“局部变量区”,“操作数栈“,“栈帧数据区”三部分组成;
JVM方法为线程私有;
当JVM方法栈内存不足时,会抛出StackOverflowError错误,可通过-Xss来指定其大小
相关文章推荐
- JVM GC的内存结构:Young Generation(Eden,from,to)、Old Generation、Permanent Generation
- jvm - 运行时内存结构
- Jvm原理剖析与调优之内存结构
- 深入理解Java虚拟机——JVM的内存结构和内存分配策略
- JVM体系结构-----深入理解内存结构
- jvm内存结构
- JVM内存结构及java相关基础知识
- JVM(2): JVM 内存结构
- JVM 内存基础存储关系结构图
- JVM运行时内存数据区结构及内存参数
- JVM原理及内存结构
- JVM内存结构---《深入理解Java虚拟机》学习总结
- 白话JVM技术细节1——JVM内存结构
- [转]JVM运行时内存结构
- JVM内存结构及内存分配策略
- HotSpot JVM 对象的内存结构和对象成员的堆内存分配原则
- JVM运行时内存结构
- Java中的OutOfMemoryError和JVM内存结构
- Java之JVM垃圾回收 内存结构以及垃圾回收算法
- JVM学习记录-JVM的内存结构管理和运行时数据区理解