服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java详细分析梳理垃圾回收机制

Java详细分析梳理垃圾回收机制

2022-11-27 15:43orangemilk_ Java教程

垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在 Java 虚拟机的语境下,垃圾指的是死亡的对象所占据的堆空间

Java语言的垃圾回收

1.垃圾回收机制的基本概念

问:1.什么是Java垃圾回收?

答:在Java语言的生命周期中,Java运行环境提供了一个系统的垃圾回收器线程,负责自动回收那些没有引用与之相连的对象所占用的内存。这种清楚无用对象进行内存回收的过程叫做垃圾回收。

问:2.Java垃圾回收的作用是什么?

答:垃圾回收是Java语言提供的一种自动内存回收的功能,可以让程序员减轻内存管理的负担,同时减少了很多错误的出现。

问:3.Java垃圾回收的方法是什么?

答: 在一个类的实例化对象创建时,Java虚拟机JVM会自动给该对象分配内存,调用该对象的构造方法并开始跟踪该对象。当该对象停止使用时,JVM会通过垃圾回收器回收该对象所占的内存。

问:4.那么,Java是如何知道一个对象没有用的呢?

答:因为系统中的每一个对象都有一个引用计数器,如果一个对象被引用一次,引用计数器相应的加1,减少一次引用,相应的引用计数器减1,以此类推,如果一个对象的引用计数器为0,则说明这个对象该回收了。

-------------------分割线-------------------

实例代码段:

?
1
2
3
4
Student stu = new Student("张 三",18);
Student stu2=stu;
stu=null;
stu2=new Student("李四",20);

思路:

Java详细分析梳理垃圾回收机制

Java详细分析梳理垃圾回收机制

-------------------分割线-------------------

当然除了引用计数法判断对象是否存活,还有很多的算法去判断。例如可达性算法。虽然引用计数法原理简单,判断效率高但是同样存在很多的缺陷。例如对象的循环引用时计数器无法判断等。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//循环引用示例
public class Student{
    String name;
    Student friend;
    public static void main(String[] args){
        Student s1 = new Student();
        Student s2 = new Student();
        s1.friend = s2;
        s2.friend = s1;
        s1 = null;
        s2 = null;
    }
}
//s1和s2相互引用对方,导致它们引用计数不为0,但是实际已是无用对象,但是无法被识别。

2.Java垃圾回收机制的好处

  • 很好的解决了对内存的一些操作问题,包括追踪,监测,释放。
  • 防止系统内存被非法释放,更加稳定安全。

3.Java垃圾回收机制的特点

只有一个变量不被任何引用类型的变量使用时,它所占用的内存才会被垃圾回收器回收。

例如:

?
1
2
3
4
String str1="HelloWorld!";
String str2=str1;
str1=null;
str2=new String("HelloJava");

程序运行到第三行时,"Helloworld!"对象仍然被str2引用,所以不会被垃圾回收器回收。只有当str2引用了一个新的对象时,此时该对象被当作垃圾被回收,例如以上程序运行到第四行的时候。

不能通过程序强迫垃圾回收器立即执行

在任何时候,程序员都不能通过程序强迫垃圾回收器立即执行,但是程序员可以通过调用System.gc()或者Runtime.gc()方法提示垃圾回收器对垃圾进行回收。但是这个方法只是提醒垃圾回收器对内存进行回收,并不一定会立即执行,它只是一个建议并非命令。

当垃圾回收器将要释放无用内存时,先调用对象的finalize()方法

当然,在Java语言中,垃圾的回收是由系统完成的,但是,有一些任务例如清理非内存资源,这些任务也可以通过覆盖Object类的finalize()方法来实现。

形式:

?
1
protected void finalize() throws Throwable

程序可能到运行结束都没有执行垃圾回收

如果一个程序只占用少量的内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。即虽然程序员定义了finalize()方法,JVM不一定调用它,然后调用System.gc提供内存回收的建议也不会起作用。因此很难保证使用该方法来释放资源是安全有效的。

-------------------分割线-------------------

代码示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//filename:GcTest.java
public class GcTest
{
    public static void main(String[] args)
    {
            new GcTest();
            // 下面两行代码的作用完全相同,强制系统进行垃圾回收
            // System.gc();
            Runtime.getRuntime().gc();
    }
    public void finalize()
    {
        System.out.println("系统正在清理GcTest对象的资源...");
    }
}

总结

  • Java的垃圾回收机制,是C++/C语言的一个重要的区别,既减轻了手动释放垃圾内存的压力,又解决了错误释放引起的安全问题!
  • 作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样严格,Java垃圾回收机制根据一定的回收策略,自动的回收内存,永不停息的保证JVM中的内存空间,防止出现内存泄露和溢出问题。

到此这篇关于Java详细分析梳理垃圾回收机制的文章就介绍到这了,更多相关Java垃圾回收机制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/zhangxia_/article/details/124260320

延伸 · 阅读

精彩推荐
  • Java教程java中为何重写equals时必须重写hashCode方法详解

    java中为何重写equals时必须重写hashCode方法详解

    这篇文章主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

    blueskyli6972021-06-11
  • Java教程Java字符串split使用方法代码实例

    Java字符串split使用方法代码实例

    这篇文章主要介绍了Java字符串split使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    勤快的懒羊羊4002020-07-30
  • Java教程深入学习Hibernate持久化对象的三个状态

    深入学习Hibernate持久化对象的三个状态

    Hibernate中的对象有3中状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象),下面通过本文给大家分享...

    动力节点8112020-12-30
  • Java教程SpringMVC表单标签知识点详解

    SpringMVC表单标签知识点详解

    这篇文章主要为大家详细介绍了SpringMVC表单标签知识点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Erola3712021-01-24
  • Java教程Java单例模式的6种实现方式详解

    Java单例模式的6种实现方式详解

    这篇文章主要介绍了Java单例模式的6种实现方式的相关资料,需要的朋友可以参考下,希望能够给你带来帮助...

    Skyper5072022-01-24
  • Java教程java实现简单的五子棋游戏

    java实现简单的五子棋游戏

    这篇文章主要为大家详细介绍了java实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zzyyyxxxx5852022-11-23
  • Java教程Java之Spring注解开发案例详解

    Java之Spring注解开发案例详解

    这篇文章主要介绍了Java之Spring注解开发案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    雪潇潇10572021-10-25
  • Java教程Spring加载加密的配置文件详解

    Spring加载加密的配置文件详解

    这篇文章主要为大家详细介绍了Spring加载加密的配置文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    二十六度半1702020-11-30