javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧

javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧

ID:30768774

大小:80.49 KB

页数:6页

时间:2019-01-03

javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧_第1页
javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧_第2页
javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧_第3页
javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧_第4页
javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧_第5页
资源描述:

《javagc系列(2):java垃圾回收是如何工作的?-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、JavaGC系列(2):Java垃圾回收是如何工作的?-编程开发技术JavaGC系列(2):Java垃圾回收是如何工作的?本文illImportNew-伍羽巾翻译口javapapers□欢迎加入翻译小组。转载诘见文末要求。目录1.垃圾回收介绍2.垃圾回收是如何工作的?3.垃圾回收的类别4.垃圾回收监视和分析本教程是为了理解基本的Java垃圾冋收以及它是如何工作的。这是垃圾冋收教程系列的第二部分。希望你已经读过了第一部分:《Java垃圾回收介绍》。Java垃圾回收是一项自动化的过程,用來管理程序所使用的运行时内存。通

2、过这一口动化过程,JVM解除了程序员在程序中分配和释放内存资源的开销。启动Java垃圾回收作为一个自动的过程,程序员不需要在代码屮显示地启动垃圾回收过程。System.gc()和Runtime.gc()用来请求JVM启动垃圾回收。虽然这个请求机制提供给程序员一个启动GC过程的机会,但是启动由JVM负责。JVM可以拒绝这个请求,所以并不保证这些调用都将执行垃圾回收。启动时机的选择由JVM决定,并口取决于堆内存中Eden区是否可用。JVM将这个选择留给了Java规范的实现,不同实现具体使用的算法不尽相同。毋庸置疑,我们

3、知道垃圾冋收过程是不能被强制执行的。我刚刚发现了一个调用System,gc()有意义的场景。通过这篇文章了解一下适合调用System.gc()这种极端情况。Java垃圾回收过程垃圾回收是一种回收无用内存空间并使其对未來实例口J用的过程。Eden区:当一个实例被创建了,首先会被存储在堆内存年轻代的Eden区中。注意:如果你不能理解这些词汇,我建议你阅读这篇?垃圾冋收介绍,这篇教程详细地介绍了内存模型、JVM架构以及这些术语。Survivor区(SO和S1):作为年轻代GC(MinorGC)周期的一部分,存活的对象(仍

4、然被引用的)从Eden区被移动到Survivor区的SO中。类似的,垃圾回收器会扫描SO然后将存活的实例移动到S1屮。(译注:此处不应该是Eden和SO屮存活的都移到S1么,为什么会先移到SO再从SO移到S1?)死亡的实例(不再被引用)被标记为垃圾冋收。根据垃圾冋收器(有四种常用的垃圾回收器,将在下一•教程中介绍它们)选择的不同,要么被标记的实例都会不停地从内存中移除,要么回收过程会在一个单独的进程中完成。老年代:?老年代(Oldortenuredgeneration)是堆内存屮的第二块逻辑区。当垃圾冋收器执彳亍M

5、inorGC周期时,在SISurvivorIX中的存活实例将会被晋升到老年代,而未被引用的对象被标记为回收。老年代GC(MajorGC):相对于Java垃圾冋收过程,老年代是实例生命周期的最后阶段。MajorGC扫描老年代的垃圾回收过程。如果实例不再被引用,那么它们会被标记为回收,否则它们会继续留在老年代屮。内存碎片:一旦实例从堆内存中被删除,其位置就会变空并且可用于未来实例的分配。这些空出的空间将会使整个内存区域碎片化。为了实例的快速分配,需要进行碎片整理。基于垃圾冋收器的不同选择,冋收的内存区域要么被不停地被整

6、理,要么在一个单独的GC进程中完成。垃圾回收中实例的终结在释放一个实例和回收内存空间Z前,Java垃圾回收器会调用实例各自的?finalize()?方法,从而该实例有机会释放所持有的资源。虽然可以保证?finalize()?会在回收内存空间之前被调用,但是没有指定的顺序和吋间。多个实例间的顺序是无法被预知,英至可能会并行发生。程序不应该预先调整实例Z间的顺序并使用?finalizc()?方法回收资源。•任何在finalizeit程中未被捕获的界常会口动被忽略,然后该实例的finalize过程被取消。•JVM规范屮并

7、没有讨论关于弱引川的垃圾回收机制,也没有很明确的要求。具体的实现都由实现方决定。•垃圾回收是由一个守护线程完成的。•所有实例都没有活动线程访问。•没有被其他任何实例访问的循坏引用实例。Java中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。引用类型强引用(StrongReference)软引用(SoftReference)弱引用(WeakReferenee)虚引用(PhantomReference)垃圾收集不符合垃圾收集垃圾收集可能会执行,但会作为最后的选择符合垃圾收集符合垃圾收集在编译过程

8、中作为一种优化技术,Java编译器能选择给实例赋?null?值,从而标记实例为可回收。classAnimal{publicstaticvoidmain(String[]args)Animallion=newAnimal();Systein.out・printin(,zMainiscompleted.”);protectedvoidfinalize(){Sys

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。