我在成长
java 堆内存的转换和分析
上一篇 /
下一篇 2011-05-24 14:12:07
/ 个人分类:个人日记
基于
java的应用进行
性能测试的时候,都会去观察她的
内存使用情况,以免出现内存溢出或者内存使用的异常,那么
jvm对于内存空间的使用,是怎么样的机制呢,下面是我看到过的比较清楚的描述,记录在此。标明
转帖:http://blog.csdn.net/mahongming/archive/2010/11/06/5992083.aspx
1、堆(Heap)内存1) 运行时数据区域,所有类实例和数组的内存均从此处分配。Java虚拟机启动时创建。
2) 组成
组成 | 详解 |
Young Generation | 即图中的Eden + From Space + To Space Eden存放新生的对象 Survivor Space有两个,存放每次垃圾回收后存活的对象 |
Old Generation | Tenured Generation即图中的Old Space 主要存放应用程序中生命周期长的存活对象 |
2、非堆内存
1) JVM具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法的代码。它是在Java虚拟机启动时创建的。
2) 除了方法区外,Java虚拟机还需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT编译器需要内存来存储从Java虚拟机代码转换而来的本机代码,从而获得高性能。
组成 | 详解 |
Permanent Generation | 即图中的Permanent Space 存放JVM自己的反射对象,比如类对象和方法对象、jar包相关meta信息 |
native heap | JVM内部处理或优化 |
1、分代GC策略
组成 | 详解 |
堆(Heap)内存 | JVM采用一种分代回收(generational collection)的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍,以便让出更多的系统资源供应用系统使用。 |
非堆内存 | GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen Space错误。 |
2、 内存分配(申请)过程步骤 | 操作 |
1 | JVM会试图为相关Java对象在Eden中初始化一块内存区域; |
2 | 当Eden空间足够时,内存申请结束。否则到下一步; |
3 | JVM试图释放对Eden中所有不活跃的对象minor collection,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区; |
4 | Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区; |
5 | 当OLD区空间不够时,JVM会在OLD区进行major collection; |
6 | 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误" |
3、对象衰老过程
步骤 | 操作 |
1 | young generation的内存,由一块Eden和两块Survivor Space构成。新创建对象的内存都分配自eden。两块Survivor Space总有会一块是空闲的,用作copying collection的目标空间。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数的minor collection后,年纪大了,就会被移到old generation中,称为tenuring。 |
2 | 剩余内存空间不足会触发GC,如eden空间不够了就要进行minor collection,old generation空间不够要进行major collection,permanent generation空间不足会引发Full GC。 |
相关阅读:
- Scala讲座:全局变量问题的解决 (xin_晴, 2011-5-12)
- 移动应用程序开发应考虑的八大安全问题 (xin_晴, 2011-5-13)
- 初探Java企业级开源框架OSGi (xin_晴, 2011-5-16)
- 如果要用Java实现算法,一定慎用递归 (xin_晴, 2011-5-16)
- Java开发者需要注意的十条法则 (xin_晴, 2011-5-17)
- 常见的十四种Java开发工具的特点 (xin_晴, 2011-5-18)
- Javascript中闭包的作用域链 (xin_晴, 2011-5-19)
- 详细解析Java中抽象类和接口的区别 (xin_晴, 2011-5-20)
- J2EE的13种核心技术 (xin_晴, 2011-5-23)
- 程序员到底为了什么钻研技术? (xin_晴, 2011-5-24)
收藏
举报
TAG:
GC
gc
java
jvm
JVM
内存
新生代
老生代