vm内存结构(译) - 高飞网
242 人阅读

vm内存结构(译)

2015-12-12 14:42:54

经验表明,JVM内存结构和其他相关方面,诸如各种内存的大小,生死对象等有时可能出现一种不确定性。
这篇文章中,我们将试着解决这些问题澄清这一点。

堆和非堆内存

JVM内存包含以下几个段:
·堆内存:指的是存放java对象的区域
·非堆内存:指的被java用来存储加载的类和其他元数据
·JVM代码自身,JVM内部结构,加载代理程序的代码和数据等。

堆(Heap):

堆是在JVM启动时创建的。JVM中的堆内存是指所有类实例和数组分配的运行时数据区。堆内存也叫共享内存。
堆的大小可以用以下的VM参数来配置:
·-Xmx<size>    设置最大的java堆内存
·-Xms<size> 设置初始的java堆内存
默认情况下,最大堆内存是64Mb

堆内存的对象是被一种称为垃圾回收器(garbage collector)的自动内存管理系统来清理的。
堆可能是固定大小,也可能是可扩展和收缩的,这个是基于垃圾回收器的策略。

堆内存是被所有线程共享访问的。

非堆(Non-Heap):

当然,JVM还有另一种不同于堆的内存,称为非堆内存。它也是在JVM启动时创建且保存了每个
类的结构,如运行时常量池(runtime constant pool),字段(field)和方法数据(method data),
方法代码和构造函数,字符串。

不幸的是,JVM提供的关于非堆内存的仅有的信息就是它的大小,没有其他详细的内存可知。

非堆内存的异常增长可能会引发潜在的问题,这种情况下你可检查下面几项:
·如果有类加载的问题如泄漏的类加载器,这时可以用“类加载器视图”来解决。
·如果字符串有大量的扣留。发现这个问题,“类分配记录”可以提供帮助。

如果应用程序确实需要很多非堆内存且默认的64Mb不够,可以用-XX:MaxPermSize参数来扩大它。如
-XX:MaxPermSize=128m就是把非堆设为128Mb

分配和已使用的内存

分配了的内存是指JVM分配的内存总量,而使用的内存是指正在真实使用的内存。
很明显,分配的内存不能少于使用的内存。准确的内存分配大小于JVM内部策略才决定。

使用的堆内存:活的和死去的对象

活的对象是指应用程序可访问到的不会被垃圾回收器收集的。

死的对象是指久远不会被应用程序访问的且还没有被收集的。这些对象会在堆中出现直到被gc收集




相关:

http://java-espresso.blogspot.com/2011/04/memory-structure-in-jvm.html
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
http://javapapers.com/core-java/java-jvm-memory-types/
还没有评论!
54.224.106.124