- 浏览: 25024 次
- 性别:
- 来自: 上海
文章分类
最新评论
如何区分垃圾
上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。
同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。
因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而最简单的Java栈就是Java程序执行的main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式
如何处理碎片
由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。
如何解决同时存在的对象创建和对象回收问题
垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解决二者矛盾的方式。
但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处理能力也会相应降低,同时,“碎片”问题将会比较难解决。
发表评论
-
[转] JVM调优总结(十二)-参考资料
2010-05-06 10:55 857能整理出上面一些东西,也是因为站在巨人的肩上。下面是一些参考资 ... -
[转] JVM调优总结(十一)-反思
2010-05-06 10:53 760垃圾回收的悖论 所谓“成也萧何败萧何”。Java ... -
[转] JVM调优总结(十)-调优方法
2010-05-06 10:52 956JVM调优工具 Jconsole,jProfile,Vi ... -
[转] JVM调优总结(九)-新一代的垃圾回收算法
2010-05-06 10:50 1560垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度 ... -
[转] JVM调优总结(八)-典型配置举例2
2010-05-06 10:49 750常见配置汇总 堆设置 -Xms:初始堆大小 ... -
[转] JVM调优总结(七)-典型配置举例1
2010-05-06 10:46 824以下配置主要针对分代垃圾回收算法而言。 堆大小设置 ... -
[转] JVM调优总结(六)-分代垃圾回收详述2
2010-05-06 10:44 860分代垃圾回收流程示意 ... -
[转] JVM调优总结(五)-分代垃圾回收详述1
2010-05-06 10:41 982为什么要分代 分代的垃圾回收策略,是基于这样一个事实 ... -
[转] JVM调优总结(三)-基本垃圾回收算法
2010-05-06 10:38 888可以从不同的的角度去 ... -
[转] JVM调优总结(二)-一些概念
2010-05-06 10:36 921Java对象的大小 基 ... -
[转] JVM调优总结(一)-- 一些概念
2010-05-06 10:27 821数据类型 Java ... -
[转]理解 Java 的 GC 与 幽灵引用
2010-05-06 09:56 878理解 Java 的 GC 与 幽灵 ... -
[转]JVM分代垃圾回收策略的基础概念
2010-05-05 17:26 979文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回 ... -
[转]利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码)
2010-05-05 17:14 1321利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码) ( ... -
通过GC输出分析内存泄露问题
2010-05-05 17:09 739参考以下文章 http://www.iteye.com/top ... -
【转】Java程序员必须了解GC的工作原理
2010-05-05 17:02 1021一个优秀的Java程序员必 ...
相关推荐
JVM调优总结 -Xms -Xmx -Xmn -Xss JVM调优总结 -Xms -Xmx -Xmn -Xss
1.5 JVM调优总结(四)-垃圾回收面临的问题 12 1.6 JVM调优总结(五)-分代垃圾回收详述1 14 1.7 JVM调优总结(六)-分代垃圾回收详述 1.8 JVM调优总结(七)-典型配置举例 1.9 JVM调优总结(八)-典型配置举例2 31 ...
JVM调优总结 -Xms -Xmx -Xmn -Xss
JVM调优总结1-12
JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 ...JVM调优:命令行指令,设置堆内存大小的参数
JVM的调优总结 1.JVM配置 2.GC算法
jvm调优测试仓库-jvm-monitor
1.4 JVM调优总结(四)-垃圾回收面临的问题 1.5 JVM调优总结(五)-分代垃圾回收详述1 1.6 JVM调优总结(六)-分代垃圾回收详述2 1.7 JVM调优总结(七)-典型配置举例1 1.8 JVM调优总结(八)-典型配置举例2 1.9 ...
JVM调优总结 JVM调优总结 JVM调优总结
学习juc、nio、netty、tomcat调优、jvm调优-Advanced-JAVA
JVM调优总结PDF,带原理图,延时如何进行分代垃圾回收
用于测试jvm gc调优-share-jvm-gc
jvm-full-gc调优-jvm-full-gc
JVM 参数调优-optimization-jvm
Jvm调优练习-jvm-tuning
JVM调优总结 --收集某位高人的博客.
FYI. JVM调优总结 JVM调优总结 JVM调优总结
JVM调优总结(六)-分代垃圾回收详述2[归纳].pdf
深入虚拟机---JVM调优总结(摘自网上网上大牛分享),主要是详细介绍了gc的收集,觉得不错。