广告
返回顶部
首页 > 资讯 > 精选 >Java垃圾回收的示例分析
  • 929
分享到

Java垃圾回收的示例分析

java 2023-05-30 17:05:42 929人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Java垃圾回收的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序

这篇文章将为大家详细讲解有关Java垃圾回收的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序员在程序中分配和释放内存资源的开销。

启动Java垃圾回收

作为一个自动的过程,程序员不需要在代码中显示地启动垃圾回收过程。System.GC()和Runtime.gc()用来请求JVM启动垃圾回收。

虽然这个请求机制提供给程序员一个启动GC过程的机会,但是启动由JVM负责。JVM可以拒绝这个请求,所以并不保证这些调用都将执行垃圾回收。启动时机的选择由JVM决定,并且取决于堆内存中Eden区是否可用。JVM将这个选择留给了Java规范的实现,不同实现具体使用的算法不尽相同。

毋庸置疑,我们知道垃圾回收过程是不能被强制执行的。我刚刚发现了一个调用System.gc()有意义的场景。通过这篇文章了解一下适合调用System.gc()这种极端情况。

Java垃圾回收过程

垃圾回收是一种回收无用内存空间并使其对未来实例可用的过程。

Java垃圾回收的示例分析

Eden区:当一个实例被创建了,首先会被存储在堆内存年轻代的Eden区中。

注意:如果你不能理解这些词汇,我建议你阅读这篇垃圾回收介绍,这篇教程详细地介绍了内存模型、JVM架构以及这些术语。

Survivor区(S0和S1):作为年轻代GC(MinorGC)周期的一部分,存活的对象(仍然被引用的)从Eden区被移动到Survivor区的S0中。类似的,垃圾回收器会扫描S0然后将存活的实例移动到S1中。

(译注:此处不应该是Eden和S0中存活的都移到S1么,为什么会先移到S0再从S0移到S1?)

死亡的实例(不再被引用)被标记为垃圾回收。根据垃圾回收器(有四种常用的垃圾回收器,将在下一教程中介绍它们)选择的不同,要么被标记的实例都会不停地从内存中移除,要么回收过程会在一个单独的进程中完成。

老年代:老年代(Oldortenuredgeneration)是堆内存中的第二块逻辑区。当垃圾回收器执行MinorGC周期时,在S1Survivor区中的存活实例将会被晋升到老年代,而未被引用的对象被标记为回收。

老年代GC(MajorGC):相对于Java垃圾回收过程,老年代是实例生命周期的最后阶段。MajorGC扫描老年代的垃圾回收过程。如果实例不再被引用,那么它们会被标记为回收,否则它们会继续留在老年代中。

内存碎片:一旦实例从堆内存中被删除,其位置就会变空并且可用于未来实例的分配。这些空出的空间将会使整个内存区域碎片化。为了实例的快速分配,需要进行碎片整理。基于垃圾回收器的不同选择,回收的内存区域要么被不停地被整理,要么在一个单独的GC进程中完成。

垃圾回收中实例的终结

在释放一个实例和回收内存空间之前,Java垃圾回收器会调用实例各自的finalize()方法,从而该实例有机会释放所持有的资源。虽然可以保证finalize()会在回收内存空间之前被调用,但是没有指定的顺序和时间。多个实例间的顺序是无法被预知,甚至可能会并行发生。程序不应该预先调整实例之间的顺序并使用finalize()方法回收资源。

任何在finalize过程中未被捕获的异常会自动被忽略,然后该实例的finalize过程被取消。

JVM规范中并没有讨论关于弱引用的垃圾回收机制,也没有很明确的要求。具体的实现都由实现方决定。

垃圾回收是由一个守护线程完成的。

对象什么时候符合垃圾回收的条件?

所有实例都没有活动线程访问。

没有被其他任何实例访问的循环引用实例。

Java中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。

引用类型垃圾收集
强引用(Strong Reference)不符合垃圾收集
软引用(Soft Reference)垃圾收集可能会执行,但会作为最后的选择
弱引用(Weak Reference)符合垃圾收集
虚引用(Phantom Reference)符合垃圾收集

在编译过程中作为一种优化技术,Java 编译器能选择给实例赋 null 值,从而标记实例为可回收。

class Animal {  public static void main(String[] args) {    Animal lion = new Animal();    System.out.println("Main is completed.");  }   protected void finalize() {    System.out.println("Rest in Peace!");  }}

在上面的类中,lion对象在实例化行后从未被使用过。因此Java编译器作为一种优化措施可以直接在实例化行后赋值lion=null。因此,即使在SOP输出之前,finalize函数也能够打印出'RestinPeace!'。我们不能证明这确定会发生,因为它依赖JVM的实现方式和运行时使用的内存。然而,我们还能学习到一点:如果编译器看到该实例在未来再也不会被引用,能够选择并提早释放实例空间。

关于对象什么时候符合垃圾回收有一个更好的例子。实例的所有属性能被存储在寄存器中,随后寄存器将被访问并读取内容。无一例外,这些值将被写回到实例中。虽然这些值在将来能被使用,这个实例仍然能被标记为符合垃圾回收。这是一个很经典的例子,不是吗?

当被赋值为null时,这是很简单的一个符合垃圾回收的示例。当然,复杂的情况可以像上面的几点。这是由JVM实现者所做的选择。目的是留下尽可能小的内存占用,加快响应速度,提高吞吐量。为了实现这一目标,JVM的实现者可以选择一个更好的方案或算法在垃圾回收过程中回收内存空间。

当finalize()方法被调用时,JVM会释放该线程上的所有同步

GCScope示例程序

Class GCScope {GCScope t;static int i = 1;public static void main(String args[]) {GCScope t1 = new GCScope();GCScope t2 = new GCScope();GCScope t3 = new GCScope();// No Object Is Eligible for GCt1.t = t2;// No Object Is Eligible for GCt2.t = t3;// No Object Is Eligible for GCt3.t = t1;// No Object Is Eligible for GCt1 = null;// No Object Is Eligible for GC (t3.t still has a reference to t1)t2 = null;// No Object Is Eligible for GC (t3.t.t still has a reference to t2)t3 = null;// All the 3 Object Is Eligible for GC (None of them have a reference.// only the variable t of the objects are referring each other in a// rounded fashion fORMing the Island of objects with out any external// reference)}protected void finalize() {System.out.println("Garbage collected from object" + i);i++;}class GCScope {GCScope t;static int i = 1;public static void main(String args[]) {GCScope t1 = new GCScope();GCScope t2 = new GCScope();GCScope t3 = new GCScope();// 没有对象符合GCt1.t = t2;// 没有对象符合GCt2.t = t3;// 没有对象符合GCt3.t = t1;// 没有对象符合GCt1 = null;// 没有对象符合GC (t3.t 仍然有一个到 t1 的引用)t2 = null;// 没有对象符合GC (t3.t.t 仍然有一个到 t2 的引用)t3 = null;// 所有三个对象都符合GC (它们中没有一个拥有引用。// 只有各对象的变量 t 还指向了彼此,// 形成了一个由对象组成的环形的岛,而没有任何外部的引用。)}protected void finalize() {System.out.println("Garbage collected from object" + i);i++;}

GC OutOfMemoryError 的示例程序

GC并不保证内存溢出问题的安全性,粗心写下的代码会导致 OutOfMemoryError。

import java.util.LinkedList;import java.util.List;public class GC {public static void main(String[] main) {List l = new LinkedList();// Enter infinite loop which will add a String to the list: l on each// iteration.do {l.add(new String("Hello, World"));}while (true);}}

输出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space  at java.util.LinkedList.linkLast(LinkedList.java:142)  at java.util.LinkedList.add(LinkedList.java:338)  at com.javapapers.java.GCScope.main(GCScope.java:12)

关于“Java垃圾回收的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java垃圾回收的示例分析

本文链接: https://www.lsjlt.com/news/220188.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java垃圾回收的示例分析
    这篇文章将为大家详细讲解有关Java垃圾回收的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序...
    99+
    2023-05-30
    java
  • JVM垃圾回收算法的示例分析
    这篇文章主要介绍了JVM垃圾回收算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新一代JVM垃圾回收算法JVM垃圾回收的瓶颈传统分代JVM垃圾回收方式,已经在一定...
    99+
    2023-06-17
  • js中垃圾回收机制的示例分析
    这篇文章主要介绍了js中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理找到不再被使用的变量,然后释放其占用的内存,...
    99+
    2022-10-19
  • PHP中垃圾回收机制的示例分析
    小编给大家分享一下PHP中垃圾回收机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果用过C语言,那么申请内存的方式是malloc或者是calloc,...
    99+
    2023-06-15
  • JVM中垃圾回收机制的示例分析
    这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、...
    99+
    2023-06-29
  • kubernetes中垃圾回收机制的示例分析
    这篇文章主要介绍了kubernetes中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:前言Kubernetes系统在长时间运行后,Kubernete...
    99+
    2023-06-04
  • 浏览器中垃圾回收机制的示例分析
    这篇文章将为大家详细讲解有关浏览器中垃圾回收机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。浏览器的垃圾回收机制垃圾回收是一种自动的内存管理机制。当计算机上的...
    99+
    2022-10-19
  • go:垃圾回收GC触发条件的示例分析
    这篇文章将为大家详细讲解有关go:垃圾回收GC触发条件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、...
    99+
    2023-06-14
  • Java垃圾回收机制的示例详解
    目录一、概述二、对象已死?1.引用计数算法2.可达性分析算法3.四种引用4.生存还是死亡?5.回收方法区三、垃圾收集算法1.分代收集理论2.名词解释3.标记-清除算法4.标记-复制算...
    99+
    2022-11-13
  • Python垃圾回收及Linux Fork实例分析
    这篇文章主要介绍了Python垃圾回收及Linux Fork实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python垃圾回收及Linux Fork实例分析文章都会有所收获,下面我们...
    99+
    2023-06-26
  • JavaGC垃圾回收算法分析
    目录对象探活强-软-弱-虚引用标记清除标记复制标记整理回收算法的在堆内存上的应用对象探活 在讨论回收算法前,更为重要的问题是如何判断一个对象是否可以被回收? 引用计数算法 每个对象会...
    99+
    2022-12-20
    Java GC垃圾回收 Java GC回收算法
  • js中新生代垃圾回收知识点的示例分析
    这篇文章将为大家详细讲解有关js中新生代垃圾回收知识点的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在进行老生代的标记清除法回收以前,还会有一个新生代的垃圾回收...
    99+
    2022-10-19
  • 分析PHP的垃圾回收机制
    如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式。很...
    99+
    2022-11-12
  • Java超详细分析垃圾回收机制
    目录前言垃圾回收概述内存溢出和内存泄漏垃圾回收算法标记阶段STW(Stop-the-World)回收阶段标记-清除算法复制算法标记-压缩算法三种算法的比较总结前言 在前面我们对类加载...
    99+
    2022-11-13
  • 分析Java内存管理与垃圾回收
    这篇文章主要介绍“分析Java内存管理与垃圾回收”,在日常操作中,相信很多人在分析Java内存管理与垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析Java内存管理...
    99+
    2022-10-19
  • PHP中垃圾收集机制的示例分析
    这篇文章主要为大家展示了“PHP中垃圾收集机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中垃圾收集机制的示例分析”这篇文章吧。PHP的垃圾收...
    99+
    2022-10-19
  • JVM中垃圾收集算法的示例分析
    这篇文章给大家分享的是有关JVM中垃圾收集算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是垃圾本文要讲的是垃圾收集算法,那么首先要确定的问题就是什么是垃圾,也就是哪些对象是要被回收的,对此有...
    99+
    2023-06-15
  • python语言开发垃圾回收机制原理的示例分析
    这篇文章主要介绍python语言开发垃圾回收机制原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.什么是垃圾回收机制垃圾回收机制(简称GC), 解释器自带的一种机制它是一种动态存储管理技术,自动释放不再...
    99+
    2023-06-25
  • Java详细分析梳理垃圾回收机制
    目录Java语言的垃圾回收1.垃圾回收机制的基本概念2.Java垃圾回收机制的好处3.Java垃圾回收机制的特点总结Java语言的垃圾回收 1.垃圾回收机制的基本概念 问:1.什么是...
    99+
    2022-11-13
  • php内存管理机制与垃圾回收机制的示例分析
    这篇文章给大家分享的是有关php内存管理机制与垃圾回收机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、内存管理机制先看一段代码:<php//内存管理机制var_dump(memory_get...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作