关闭

JavaGC垃圾处理

1824人阅读 评论(0) 收藏 举报
分类:

Java的GC一般是在JVM的堆上进行的,Java的堆中存放了大量的对象实例,所以JavaGC也叫GC堆。

Java将内存区划分为:

新生代(Young Generation/New)

    Eden Space

    From Survivor/Survivor 0

    To Survivor/Survivor 1

老年代(Tenured Generation/Old)

永久代(一般指方法区和常量池,一般情况下永久代在虚拟机运行时就能确定大小的,但是一些框架可能会动态生成类信息就会导致永久代越来越大)


新生代要如此划分是因为新生代使用的GC算法是复制收集算法。这种算法效率较高,而GC主要是发生在对象经常消亡的新生代,因此新生代适合使用这种复制收集算法。由于有一个假设:在一次新生代的GC(Minor GC)后大部分的对象占用的内存都会被回收,因此留存的放置GC后仍然活的对象的空间就比较小了。这个留存的空间就是Survivor space:From Survivor或To Survivor。这两个Survivor空间是一样大小的。例如,新生代大小是10M(Xmn10M),那么缺省情况下(-XX:SurvivorRatio=8),Eden Space 是8M,From和To都是1M。


在new一个对象时,先在Eden Space上分配,如果Eden Space空间不够就要做一次Minor GC。Minor GC后,要把Eden和From中仍然活着的对象们复制到To空间中去。如果To空间不能容纳Minor GC后活着的某个对象,那么该对象就被promote到老年代空间。从Eden空间被复制到To空间的对象就有了age(年龄)=1。此age=1的对象如果在下一次的Minor GC后仍然存活,它还会被复制到另一个Survivor空间(如果认为From和To是固定的,就是又从To回到了From空间),而它的age=2。如此反复,如果age大于某个阈值(-XX:MaxTenuringThreshold=n),那个该对象就也可以promote到老年代了。


如果Survivor空间中相同age(例如,age=5)对象的总和大于等于Survivor空间的一半,那么age>=5的对象在下一次Minor GC后就可以直接promote到老年代,而不用等到age增长到阈值。


在做Minor GC时,只对新生代做回收,不会回收老年代。即使老年代的对象无人索引也将仍然存活,直到下一次Full GC


深入了解JavaGC机智可参考文章:http://blog.csdn.net/initphp/article/details/30487407



1
0
查看评论

JVM的GC简介和实例

本文是一次内部分享中总结了jvm gc的分类和一些实例, 内容是introduction级别的,供初学人士参考. 成文仓促,难免有些错误,如果有大牛发现,请留言,我一定及时更正,谢谢! JVM内存布局主要包含下面几个部分: Java Virtual Machine Stack: 也就是...
  • huoyunshen88
  • huoyunshen88
  • 2013-10-21 21:52
  • 2784

Java垃圾处理机制学习总结

对Java 虚拟机底层垃圾回收机制的探讨!
  • u010278162
  • u010278162
  • 2016-03-29 16:38
  • 1232

java中的垃圾处理机制

1.何为垃圾 在Java中,如果对象实体没有引用指向的话,存储该实体的内存便成为垃圾。JVM会有一个系统线程专门负责回收垃圾。垃圾同时包括分配对象内存间的碎片块, 2.垃圾处理包含的算法 Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做...
  • sbl19940819
  • sbl19940819
  • 2017-07-11 14:43
  • 287

JavaGc

Java GC(garbage collec,垃圾收集,回收)GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里讲的分代收集也是指对堆内存的回收GC的分代收集分为:年轻代、老年代、永久代。(方法区是被当做永久代的,不过J...
  • u014693709
  • u014693709
  • 2017-09-09 17:06
  • 102

javaGC

一想到GC(垃圾回收),伴随着3个疑问 何时触发GC 哪些内存要被GC 怎样回收这些内存 何时触发GC以堆为例: 随着程序运行,java堆被占用的内存越来越多,内存不够分配一个对象实例时,JVM会触发GC,清理掉死数据内存哪些内存被GC引用计数算法这算法基本思路是: 给对象中添加一个引用计数器,...
  • y1247793952
  • y1247793952
  • 2017-03-08 15:11
  • 84

JAVA中垃圾处理,垃圾处理算法

前言面试中经常面试官会问道,对垃圾算法有了解吗,通常笔者就会感到很不解,真是应了那句话”面试造飞机,工作拧螺丝的比喻“。其实我们写代码中,对垃圾算法的了解多少,影响不到多少。但,换句话说,想要写出高质量的代码,对垃圾的算法了解还是有必要的。内存模型jvm的内存主要分为堆和栈,栈内存用于存储线程的上下...
  • ant1993
  • ant1993
  • 2017-09-23 17:05
  • 96

Java内存管理和垃圾处理机制

对于java程序员来说,不用像C和C++的开发人员,需要开发人员手动的去参与内存管理,每一件事情都需要他们亲力亲为,java开发人员在虚拟机的自动管理内存机制的帮助下,不需要为new操作的对象去delete/free去释放内存,而且不容易存在内存泄漏和内存溢出等问题。不过正是因为将内存释放交给了虚拟...
  • Zahara_L
  • Zahara_L
  • 2017-09-05 10:17
  • 145

JavaGC

Java GC工作原理 GC的基本原理 GC是什么?为什么要有GC呢? GC是垃圾收集的意思(GarbageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是...
  • u010708759
  • u010708759
  • 2017-09-06 11:44
  • 31

JAVA 垃圾处理

1. 什么是内存垃圾,哪些内存符合垃圾的标准 我们在前面讲过了,堆是一个"运行时"数据区,是通过"new"等指令建立的,Java 的堆 是由Java 的垃圾回收机制来负责处理的,堆是动态分配内存大小,垃圾收集器可以自动回 收不再使用的内存空间。 也就...
  • jiunizhuai
  • jiunizhuai
  • 2011-12-14 17:02
  • 1238

如何自己编写程序文件清理电脑垃圾

Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:*.tmp、*._mp)日志文件(*.log)、临时帮助文件(*.gid)、磁盘检查文件(*.chk)、临时备份文件(如:*.old、*.bak)、IE的临时文件夹“Temporary Internet Files”。所以应...
  • m0_38110604
  • m0_38110604
  • 2017-09-25 20:16
  • 156
    个人资料
    • 访问:4429801次
    • 积分:24216
    • 等级:
    • 排名:第328名
    • 原创:246篇
    • 转载:35篇
    • 译文:8篇
    • 评论:1069条
    博客专栏
    最新评论