JVM内存分配

JVM内存结构,根据《Java虚拟机规范(第二版)》:

02120142_QQ6v
程序计数器:线程私有。当前线程所执行字节码的行号指示器。虚拟机概念模型中,通过改变计数器的值来读取下一条需要执行的字节码指令。
虚拟机栈:线程私有。方法执行时创建栈帧,存储局部变量表(只存储基本数据类型和对象引用类型)、操作栈、动态链接、方法出口等。
本地方法栈:线程私有。为虚拟机使用到的Native方法服务。
堆:线程共享。几乎所有的对象实例及数组都要在堆上分配。垃圾收集器管理的主要区域。
方法区:线程共享。存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。
运行时常量池(Runtime Constant Pool):方法区的一部分。存放编译期生成的各种字面量和符号引用。
直接内存(Direct Memory):不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。NIO(New Input/Output)类,引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,可是有Native函数库直接分配堆外内存,通过存储在堆中的DirectByteBuffer对象作为该内存的引用进行操作。
永久区(Permanent):Permanet Generation(HotSpot8已移除该区域,新增MetaSpace) to store the JVM’s reflective data such as class and method objects
堆结构:Young Generation(Eden Space, Survivor Space(from, to)), Tenured Generation(Virtual Space)
Minor GC:新生代GC,发生在新生代的垃圾收集动作,非常频繁,速度比较快
Major GC/Full GC:老年代GC,发生在老年代的GC,经常伴随Minor GC,速度慢
内存调整参数:
ppt_img
-XX:SurvivorRatio=8:设置Eden区与Servivor区大小比例,默认8
//参考资料:《深入理解Java虚拟机JVM高级特性与最佳实践》
This entry was posted in Java. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s