理解 Java GC(一)

引言:

申明:本文翻译自Sangmin Lee的Understanding Java Garbage Collection.

原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/

知道Java中GC的工作原理有啥好处呢?首先,是软件工程师好奇心得到满足;其次,让你写出更加优秀的Java应用。这其实是一个我个人的且主观的想法,但我认为作为一个优秀的Java开发者, 熟练和精通GC是必须的。如果你知道GC的工作细节,那就意味着你可以掌控应用程序的规模。如果你认真的考虑过如何选择GC算法,那么你对自己开发的程序的 特性是完全可以掌控的。当然,这并不是评判一个好的开发者的准则。但是,所 有人都认为GC是优秀的Java开发者的必备技能。

本文是“成为Java GC专家”系列的第一篇。本文将会简要的阐述GC,后续,我 会分析GC的状态和GC调优的例子。

本文将采用通熟易懂的方式来介绍下GC。我希望这篇文章真的能够帮助大家。 事实上,我的同事已经在JAVA内刊上发表了很多的类似的文章,这些文章在Twitter 上非常受欢迎,你也可以去看看。

正文:

言归正传,在了解GC前,有些术语我们应该知道。“stop-the-world”,无论 你看哪种GC算法,这个词都将出现。它意味着JVM停止当前应用程序的运行,转而 去执行GC。当“stop-the-world”时,除了执行GC的线程外,其他线程都将中断运行。 只有GC工作完成后,这些中断的线程才会恢复执行。所谓的GC调优意味着我们要降 低GC执行的频率,即“stop-the-world”的执行次数。

GC中的“代”概念

Java并未在代码中显示地分配和释放内存。一些人认为将对象设置为NULL或者 调用System.gc() 方法来显示释放内存。将对象设置NULL是很容易的,但调用System.gc()  很大程度上回影响系统的性能,所以是不被建议的。(幸运的是,至今为止,我还未 看见有开发者这样干过。)

在Java中,开发者是没有必要在代码中显示释放内存的。GC会找出那些没有用的 对象并且回收内存。GC的创建是基于以下两种预设。(说是推理可能更加准确点。)

1)大部分对象生命周期短,转瞬即逝;

2)旧生代(old Generation)对于新生代(young Generation)的引用数量可控。

上述的两种预设就是所谓的“weak generational hypothesis”。所以,为了更加 有说服力,HotSpot VM将内存在物理上划分为young generation:和 old generation

young generation:大部分新建的对象都位于这里。因为大部分对象很快就没有用 了,所以大部分对象在young generation创建,然后销毁。当这里一个对象销毁时,我们称之为

minor GC。

Old generation: 那些没有被销毁并且在young generation存活下来的对象被拷贝 到这里。Old
generation占用的空间比young generation大许多。正式由于这个缘故, GC在这里操作的次数比在young generation少。当这里一个对象销毁时,我们称之为 major GC或者full GC。

看图说话:

Figure 1: GC Area & Data Flow.

上面图中的permanent generation也叫作method area(方法区),这里存放类或者内置字符集。

注意,这里可不是为old generation一直存活的对象准备的。GC也会回收这里的,且发生在major GC.

一些人可能会有疑问:

如果 old generation的对象引用到 young generation的对象咋办?

为了处理这种情况,在old generation中有一种叫做“card table”的东东被设计处来,大小为512 byte。 当上述情况发生时,就被记录到这个“card table”中。当GC在young generation执行时,会扫描这张表,而不会 去检查old
generation所有对象的引用,以此来决定是否回收。这张表被一个叫做“write barrie”的东东管理。 这个 “write barrie”可以保证"minor GC"的高性能。可能一高额的消耗会因此产

生,但总体上GC的执行时长变短了。

上图:

Figure 2: Card Table Structure.

好了,今晚先译到这里,水平有限,不足之处还望大家指正。

2016-05-08 01:49

时间: 2024-11-05 20:44:34

理解 Java GC(一)的相关文章

理解 Java GC(三)

本文主要讲解下GC的5中类型: Serial GC (-XX:+UseSerialGC) Parallel GC (-XX:+UseParallelGC) Parallel Old GC(-XX:+UseParallelOldGC) CMS GC (-XX:+UseConcMarkSweepGC) G1 GC Serial GC (-XX:+UseSerialGC) 在之前的文章里,我们已经讲解过GC在 young generation采用的GC算法了.GC在 old generation采用的

Java GC回收机制

优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能. 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.本篇文章首先简单介绍GC的工

Java GC(垃圾回收)机制知识总结

目录 Java GC系列 Java系列笔记(3) - Java 内存区域和GC机制 面试题:"你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?" Java GC系列 本部分来自Java GC系列(1):Java垃圾回收简介 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序. 下面四篇教程是了解Java 垃圾回收(GC)的基

[译]GC专家系列1: 理解Java垃圾回收

原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适

Java GC专家系列1:理解Java垃圾回收

了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适的GC算法,说明你对你所开发的程序有了全面的了解.当然这对一个优秀的程序员来说未必是一个通用的标准,但很少人会反对我关于”理解GC是作为优秀Java程序员的必备技能”的

Java GC专家系列2:Java 垃圾回收的监控

这是”成为GC专家系列”文章的第二篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.到目前为止,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在本篇中,我将介绍JVM在真实环境中如何运行GC的. 什么是GC监控 GC监控 指的是在运行时跟踪JVM运行GC的过程.例如,通过GC监控,我们能找出: 何时新生代的对象会被移动到老年代,有多少对象被移到了老年代. 何时stop-the-world发生以及持续时间. 通

Java GC 专家系列5:Java应用性能优化的原则

本文是GC专家系列中的第五篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在第二篇Java垃圾回收的监控中介绍了在真实场景中JVM是如何运行GC,如何监控GC数据以及有哪些工具可用来方便进行GC监控. 在第三篇GC 调优中基于真实案例介绍了可用于GC调优的最佳选项.同时也描述了如何通过降低移动到老年代中对象的数量来缩短Full GC耗时,以及如何设置GC类

成为Java GC专家(3)—如何优化Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第三篇.在第一篇<成为JavaGC专家Part I — 深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在第二篇<成为JavaGC专家Part II — 如何监控Java垃圾回收机制>,我解释了JVM实际上是如何执行垃圾回收的,我们如何监控GC,以及

Java GC专家系列4:Apache的MaxClients设置及其对Tomcat Full GC的影响

本文是GC专家系列中的第四篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在第二篇Java垃圾回收的监控中介绍了在真实场景中JVM是如何运行GC,如何监控GC数据以及有哪些工具可用来方便进行GC监控. 在第三篇GC 调优中基于真实案例介绍了可用于GC调优的最佳选项.同时也描述了如何通过降低移动到老年代中对象的数量来缩短Full GC耗时,以及如何设置GC类