`
kyo100900
  • 浏览: 640296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

垃圾收集器是一个“宝贝收藏家”?

阅读更多

 

原文请看:http://java.dzone.com/articles/gc-goodstuff-collector

 

 

对象创建与销毁真的性能很低,造成垃圾大量回收吗?对象的重用真的如所想的那么高效吗?垃圾收集器的职责真的是回收垃圾吗?一系列看似很显然的问题你一定不屑一顾。但看完本文,相信你也许会重新看待这类看似“简单”的问题。

 

 

 

正文

 

 

在过于的几个月里,我注意到大家普遍对创建Java对象而感到恐怖。当我度着询问作者缘由时,似乎总是异口同声的将这一切归结为——为了得到更高的性能,避免垃圾收集总是合理的。

 

 

那么既然如此,为什么人们还要创建更多的对象呢?这个呢,其中一个原因就是为了让代码更具可读性。比如说,封装一个算法,然后使用一个合适的helper object来表示该算法会显示更加清晰优雅。

 

 

即使当代码没有被封装在helper object中,也会更倾向于的将它的一个实例反复的重用,避免垃圾回收,从而使得性能表现更加出众。我的第一条建议永远是:“你应该事先衡量这样是否真的有效。”如果要我说的更清楚点,那就是“如果你无法证明创建少的对象可以提高性能,那么很有可能它真就不是这样。”我已经从事许多关于优化的工作,得到一个结论就是:在某一个语言上优化的的正确结果对其它语言还说并不一定就是对的(也就是说,语言之间的优化方式是不可直接复制的)。那怕就算你使用相同的语言,不同的机器之间的优化也不尽相同,说不定在该机器上的最优方案到那台机器反而会性能降低。最后,甚至同一台机器上的不同方面的优化也是不同的。

 

 

如果创建了一个临时对象,它的生命周期只有你所预料的那么长,将有以下几点好处:

 

1.       当你使用它的时候,它总是处于最原始的状态,不用担心被人使用过

2.       你的代码又向线程安全迈了一大步

3.       你的代码可读性更佳,并易于分析

4.       垃圾收集器几乎做很少的工作。

 

 

“什么?”你立马反驳道,“垃圾收集器会因为要收集更多的垃圾而工作的更少?”

 

 

确实如此。当我们听到“垃圾收集器”的时候,我们总是习惯的认为它总是会在垃圾堆满整个heap()的时候,才会开始工作,然后将所有的垃圾一扫而光。但实际上垃圾收集器甚至都不知道垃圾的存在。垃圾的定义就是指那些不可达的对象。垃圾收集器实际上做的就是创建一个新的heap,把你想保留的对象统统都搬过去,然后让原有的heap和剩下所谓的垃圾都“随风而逝”。因此垃圾收集器所做的一切实际上就是让对象“存活”(并不是我们所认为的充当收集者的角色)。看来垃圾收集器真是个goodstuff collector(宝贝收藏家,呵呵)

)

 

 

这里我还要提一下就是我觉得不应该完全的依赖于finalize方法来掌控你的对象。(由于这样会做会冒著破坏原先回收机制的危险,这也许就解释了是为什么finalize影响性能的原因)。我所经历过的每一次单独测量和微型测试程序(microbenchmark)都使我确定创建和销毁对象永远不是最糟糕的,并且所表现出来的性能比起总是设法让对象存活的做法要有效的多。我的确做过一些试验,因为一开始我也不相信这一点。而其他人的观念又与我的测试完全相反,我不得不研究它了。要说明的一点是,这并不能证明上述内容适合于所有的场合,但我认为当你盲打莽撞的想进行性能优化时,这些东东还是有一定的指导意义的。

 

 

看看这篇来自IBM的文章,从上的数据可以看出:在Java里,分配(allocat)一个对象大概需要10条机器指令(比最好的C/C++分配器都要好一个数量级 ),然后你再猜猜抛弃一个对象的开销是多少?是零!因此只要记住GC是一个“宝贝收藏家”,那么就一定不会错啦。

 

 

 

 

 

4
5
分享到:
评论
5 楼 langyu 2008-12-30  
java虚拟机并没有规定要以怎样的方式实现“垃圾回收”,它只是一个规范,所以不同的虚拟现实现就会出现不同的回收方式(这里说的“宝贝收集”也好,其它地方说的引用为空,回收堆空间也好)。
当然,在堆满的时候只报个错误都可以。
4 楼 hallywang 2008-12-04  
原来如此。。gc其实不去销毁对象,那也就不存在销毁对象消耗性能的说法了。

那这么说,在程序里有意的调用 gc ,并不能提高效率了?
3 楼 dearshor 2008-11-26  
受教了。之前看过一些对java gc机制一知半解的作者写的一些自以为是的性能优化之谈,现在看来,实在可笑。
2 楼 kyo100900 2008-11-26  
GC其实不会回收垃圾,因为所谓的垃圾是指那些不可达的对象,所以GC当然不认识它们。GC只会把能访问到的对象保存起来,像一个收藏爱好者那样。 等自己家堆满了东东,马上搬个新家,把认为有用的宝贝都挪过去,以前的那个老家就等着建筑公司去推平重建吧。
1 楼 Azi 2008-11-26  
好像明白,好像不明白。麻烦楼主再点明一下

相关推荐

    深入理解JVM垃圾收集算法与垃圾收集器

    深入理解JVM垃圾收集算法与垃圾收集器

    Java垃圾收集器使用小诀窍

    垃圾收集器在一个JAVA程序中的执行是自动的,不能强制执行,即是程序员能明确的判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。希望通过本文的介绍,能够给你带来帮助。

    Java的垃圾收集器(GC)

    1. **无用对象识别**:垃圾收集器判定一个对象是否可被回收的关键标准是该对象是否仍被“活动”的部分所引用。若一个对象不再被任何变量或数据结构引用,则视为无用,可被回收。 2. **自动执行**:垃圾收集器的执行...

    漫谈Java垃圾收集器.pdf

    * 统一的引用语义:Java垃圾收集器可以正确地处理多个引用对象的关系,从而避免了手动内存管理的复杂性。 * 解决了手动内存管理的困扰:Java垃圾收集器可以自动地释放内存,从而避免了手动内存管理的错误和困扰。 ...

    Java理解G1垃圾收集器.pdf

    新生代垃圾收集是G1的一个重要操作,通常由一系列短暂的暂停(pause)组成,称为年轻代暂停(young pause)。在这个过程中,G1会选取部分Eden区域进行垃圾收集,将存活的对象移动到Survivor区域,如果Survivor空间...

    7种JVM垃圾收集器特点-优劣势-及使用场景.pdf

    ParNew垃圾收集器是Serial垃圾收集器的多线程版本,它可以使用多个线程来进行垃圾收集工作。ParNew垃圾收集器适用于Server模式下的应用程序,具有较高的垃圾收集性能和较低的停顿时间。 3. Parallel Scavenge垃圾...

    G1垃圾收集器入门

    本文介绍如何使用G1,及在 Hots pot JVM 中怎么使用G1垃圾收集器。 您将了解 G1 收集器的内部原理, 切换为 G1 收集器的命令行参数, 以及让其记录GC日志的选项。 在线版地址为: ...

    1_Java虚拟机(垃圾收集器和算法).pdf

    Serial收集器是最基础的收集器,是一个单线程收集器,它在垃圾收集时会暂停其他所有工作线程,这种现象称为"Stop The World"。尽管Serial收集器在用户等待时会暂停应用的响应,但它在简单的应用场景中效率较高,且...

    Java垃圾收集器推荐.pdf

    程序员无法精确地控制垃圾收集器的工作时机,即便能够明确一个对象已经不再被使用,也无法强制其立即被垃圾收集。虽然可以通过`System.gc()`方法建议JVM进行垃圾收集,但具体执行时机与是否执行完全由JVM控制。 ...

    如何实现一个垃圾收集器 - 知乎1

    在本文中,我们将探讨如何实现一个简单的垃圾收集器,这是一个基础的自动化内存管理系统,主要针对Java环境。垃圾收集器是现代编程语言运行时系统的关键组件,负责自动管理内存,回收不再使用的对象以避免内存泄漏。...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器

    ### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 #### 一、性能工程概述 在软件开发过程中,性能工程是一个重要的环节,它不仅涵盖了对软件性能的需求定义与测试计划制定,还包括了软件的开发、实施及后续的...

    JVM垃圾收集器全面详解

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存...

    基于慧鱼模型的水上垃圾收集器设计.doc

    基于慧鱼模型的水上垃圾收集器设计.doc

    2-7垃圾收集器G1&ZGC详解.mp4

    2-7垃圾收集器G1&ZGC详解.mp4

    Java垃圾收集器知识.pdf

    - 垃圾收集器运行在一个低优先级的线程中,通常在Java虚拟机(JVM)空闲时执行。 - 在系统内存资源紧张时,垃圾收集器可能会被触发以快速回收内存,但这并不总是可预测的。 4. **控制垃圾收集**: - 开发者不能...

    04-VIP-JVM垃圾收集器详解1

    CMS收集器是第一个实现并发垃圾收集的收集器,目标是缩短垃圾收集时用户的停顿时间,适合用户体验要求较高的应用。CMS收集器采用标记-清除算法,整个过程包括初始标记、并发标记、重新标记和并发清除四个阶段。虽然...

    计算机专业外文翻译(Java垃圾收集器)

    Java垃圾收集器是Java语言中的一个关键特性,它负责自动管理程序中的内存,尤其是在对象生命周期结束时进行内存的释放。这篇3000字的毕业设计论文外文翻译主要探讨了Java垃圾收集器的工作原理及其对性能的影响。 在...

    Python垃圾收集器原理研究及应用.pdf

    Python垃圾收集器是Python编程语言中的一个重要组成部分,它负责自动管理程序运行时的内存分配与回收,以确保程序不会因为内存耗尽而崩溃。本文由郭芬和刘明撰写,分别来自美博通通信技术和上海惠普公司,深入探讨了...

    Java垃圾收集必备手册

    在这篇手册中,我们将深入探究 Java 垃圾收集的基础知识,包括垃圾收集的定义、垃圾收集算法、垃圾收集器的实现、垃圾收集优化等内容。 垃圾收集的定义 垃圾收集(Garbage Collection,简称 GC)是指在 Java 语言中...

Global site tag (gtag.js) - Google Analytics