广告
返回顶部
首页 > 资讯 > 后端开发 > Python >你真的知道Java中对象的销毁吗
  • 802
分享到

你真的知道Java中对象的销毁吗

2024-04-02 19:04:59 802人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

在日常的开发中、我们都知道,Java的内存清理是通过垃圾回收器进行的,那么其是如何将没用的对象被被清理掉的呢? Java 语言的内存自动回收称为垃圾回收(Garbage Collec

在日常的开发中、我们都知道,Java的内存清理是通过垃圾回收器进行的,那么其是如何将没用的对象被被清理掉的呢?

Java 语言的内存自动回收称为垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些不再使用的对象所占用的内存。

Java对象在使用后需要清理。 对象清理是释放该对象所占用的内存。 在创建对象时,用户必须使用new操作符为对象分配内存。 清除对象后,系统会自动回收内存,不需要用户进行额外的处理。 这也是Java语言的一个特性,它使程序员更容易管理内存。

一般一个对象被当作垃圾回收的情况主要如下两种。

1)对象的引用超过其作用范围。


{
    Object o = new Object();    // 对象o的作用范围,超过这个范围对象将被视为垃圾
}

2)对象被赋值为 null


{
    Object o = new Object();
    o = null;    // 对象被赋值为null将被视为垃圾
}

在 Java 的 Object 类中还提供了一个 protected 类型的 finalize() 方法,因此任何 Java 类都可以覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。

那么问题又来了,finalize()是个什么鬼呀,既然会调用对象的这个方法就说明所有的类都会有这个方法(毕竟所有的类都会被回收嘛),自然而然我们就想到了java的根类 Object.进去看看?


protected void finalize() throws Throwable { }

最后一行还真找到了,是一个实现为空的方法,既然是protected就说明具体的方法可以留给子类去实现之前我们说过只有当对象不再被任何引用指向时候,该对象才会被回收。那么真的是这样吗?我们举个栗子看看


public class User {
private int money;

public int getMoney() {
return money;

}

public void setMoney(int money) {
this.money = money;

}
public void cool(){
String str=new String();
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

if(money>0){
System.out.println("error");

}else{
System.out.println("suceess");
}
super.finalize();

}

}

这里我们重写finalize()方法,在销毁前如果一个人的前还没花光,打印这个人是失败的,否则这个人是成功的。下面是我们在main()中的代码


public class Test {
public static void main(String args[]){
User u1=new User(200);
new Object();
new User(100);

}

}

运行结果居然什么都没有!运行结束之后不光有引用指向的u1,就连没有任何引用指向的new User(100);居然都没有被回收。这是怎么回事呢?

我们来看看Thinking In Java中是怎样解释的

java中的并非总是被垃圾回收,也就是说对象可能不被回收。一般程序只要不到濒临存储空间用光,垃圾回收器一般都不会主动回收内存,如果程序结束,并且垃圾回收器一直没有释放你创建的空间,则随着程序的退出,资源则会被归还给操作系统。所以上面的我们finalize()才一直没有被调用

如果我们想看到效果,可以通过如下方法:


public class Test {
public static void main(String args[]){
User u1=new User(200);

new Object();

new User(100);

System.gc();

}

}

System.gc();会强制系统垃圾回收器工作,运行效果会出现error
说明new User(100);创建的对象被回收了。

注意:调用 System.gc() 或者 Runtime.gc() 方法也不能保证回收操作一定执行,它只是提高了 Java 垃圾回收器尽快回收垃圾的可能性。 

知识补充:

在 Java 虚拟机的堆区,每个对象都可能处于以下三种状态之一。

1)可触及状态:当一个对象被创建后,只要程序中还有引用变量引用它,那么它就始终处于可触及状态。

2)可复活状态:当程序不再有任何引用变量引用该对象时,该对象就进入可复活状态。在这个状态下,垃圾回收器会准备释放它所占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的 finalize() 方法,这些 finalize() 方法有可能使该对象重新转到可触及状态。

3)不可触及状态:当 Java 虚拟机执行完所有可复活对象的 finalize() 方法后,如果这些方法都没有使该对象转到可触及状态,垃圾回收器才会真正回收它占用的内存。

总结

到此这篇关于Java中对象销毁的文章就介绍到这了,更多相关Java中对象的销毁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 你真的知道Java中对象的销毁吗

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

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

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

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

下载Word文档
猜你喜欢
  • 你真的知道Java中对象的销毁吗
    在日常的开发中、我们都知道,Java的内存清理是通过垃圾回收器进行的,那么其是如何将没用的对象被被清理掉的呢? Java 语言的内存自动回收称为垃圾回收(Garbage Collec...
    99+
    2022-11-12
  • PHP中的数组和对象:你真的知道它们吗?
    在PHP中,数组和对象是两个非常重要的数据结构。虽然在实际编程中常常会用到它们,但是很多程序员对数组和对象的底层实现和使用方式并不是很清楚。本文将深入探讨PHP中的数组和对象,帮助你更好地理解它们的内部原理和使用方法。 一、PHP中的数组...
    99+
    2023-08-24
    linux 数组 对象
  • Python 对象响应框架:你真的知道它是什么吗?
    Python 是一种动态语言,允许开发人员在运行时动态地添加属性和方法。这种特性使得 Python 成为一种非常灵活的语言,但也带来了一些挑战。例如,当我们需要在运行时对对象的属性进行修改时,可能会遇到一些问题。这时,Python 对象响...
    99+
    2023-10-03
    对象 响应 框架
  • 你知道ASP IDE中的对象同步吗?
    ASP.NET是一种非常流行的Web开发框架,它提供了许多强大的功能和工具,以帮助开发人员快速构建高质量的Web应用程序。其中,ASP IDE是ASP.NET开发中最常用的集成开发环境之一。本文将介绍ASP IDE中的对象同步。 一、什么是...
    99+
    2023-06-21
    ide 同步 对象
  • 你真的知道 JavaScript 在 Java 容器中的作用吗?
    JavaScript 和 Java 是两种不同的编程语言,它们的用途和应用场景也不尽相同。但是,在 Java 容器中,JavaScript 也有着不可替代的作用。 JavaScript 是一种脚本语言,它最初是为了在网页中实现交互效果而开发...
    99+
    2023-09-12
    容器 git javascript
  • 你知道Java如何处理实时的Numpy对象吗?
    Java作为一种高效、稳定的编程语言,已经成为了许多企业级应用的首选。与此同时,Numpy作为Python中的一个重要库,也被广泛用于科学计算、数据分析等领域。那么,当Java需要处理实时的Numpy对象时,我们该怎样去做呢?本文将为大家详...
    99+
    2023-10-15
    实时 numpy 对象
  • 你真的知道什么是arguments吗
    是的,arguments 是一个特殊的 JavaScript 对象,它包含了函数被调用时传递给函数的所有参数。它类似于一个数组,可以...
    99+
    2023-09-21
    arguments
  • java string对象上的操作,常见的用法你知道吗
    目录stringstring对象上的操作 1.判断是否为空2.size()/length(); 3.s[n]4.s1+s25.s1 = s26.s1 == s27...
    99+
    2022-11-12
  • 你知道Java中如何处理大数据对象的加载吗?
    Java作为一种广泛使用的编程语言,其在处理大数据对象的加载方面也有自己的一套处理方法。本文将会介绍Java中如何处理大数据对象的加载,并给出相应的示例代码。 一、内存限制 在处理大数据对象时,内存是一个非常重要的考虑因素。Java中内存的...
    99+
    2023-08-16
    大数据 对象 load
  • 你知道如何在HTTP索引中索引Java对象吗?
    HTTP索引是一种常用的索引方法,它允许我们通过HTTP协议来索引和搜索数据。在Java应用程序中,如果我们需要将Java对象索引到HTTP索引中,我们可以使用一些开源库来实现这个过程。本文将介绍如何在HTTP索引中索引Java对象,并提供...
    99+
    2023-09-13
    对象 http 索引
  • 你知道如何在HTTP索引中创建Java对象吗?
    HTTP索引是一种常见的数据存储方式,它可以帮助我们快速地检索和查找数据。在Java编程中,我们常常需要将HTTP索引中的数据映射为Java对象。本文将介绍如何在HTTP索引中创建Java对象。 一、HTTP索引简介 HTTP索引是一种基于...
    99+
    2023-09-13
    对象 http 索引
  • 你真的知道onmouseenter与onmouseover的区别吗
    是的,onmouseenter与onmouseover是鼠标移入事件,它们的区别在于事件冒泡和触发频率。1. 事件冒泡:onmous...
    99+
    2023-09-21
    区别
  • 你知道吗?ASP中的API对象能够操作Git!
    ASP是一种广泛使用的Web编程语言,它提供了许多有用的对象和工具来帮助开发人员构建功能强大的Web应用程序。其中一个非常有用的对象是API对象,它可以用来访问和操作许多不同的Web服务和API。但是,你知道吗?ASP中的API对象还可以用...
    99+
    2023-11-03
    api 对象 git
  • 你知道如何在Laravel中使用对象吗?
    Laravel是一种流行的PHP Web应用程序框架,它提供了一系列的工具和服务来帮助开发者快速构建高质量的Web应用程序。在Laravel中,对象是一种非常重要的概念。本文将介绍如何在Laravel中使用对象。 在Laravel中,对象是...
    99+
    2023-09-25
    编程算法 laravel 对象
  • 你知道JVM中GC Root对象有哪些吗
    目录JVM中GC Root对象有哪些(一)虚拟机栈中引用的对象(二)方法区中类静态属性引用的对象(三)方法区中常量引用的对象(四)本地方法栈中引用的对象JVM 中的 GC Roots...
    99+
    2023-01-28
    JVM GC Root对象 JVM GC Root JVM对象
  • Java之对象销毁和finalize方法的使用
    目录对象的销毁finalize方法GC对对象的回收在finalize方法中,是否重新给自己指定一个引用来避免被GC回收?如果finalze方法中出现死循环会发生什么?如果对象的创建出...
    99+
    2022-11-13
  • 你知道 Python 对象和 NumPy 之间的区别吗?
    Python 对象和 NumPy 都是 Python 编程语言中非常重要的概念,但它们之间有一些区别。在本文中,我们将探讨 Python 对象和 NumPy 的区别,并介绍如何使用 NumPy 进行数据处理和科学计算。 Python 对象 ...
    99+
    2023-07-06
    对象 apache numy
  • 你真的知道如何在 PHP 中使用 NumPy 吗?
    在 PHP 中使用 NumPy 是一项非常强大的功能。NumPy 是一个 Python 库,提供了高性能的多维数组和矩阵计算功能。它是数据科学和机器学习领域中不可或缺的工具之一。虽然 PHP 不是一种数据科学或机器学习语言,但它仍然可以使用...
    99+
    2023-10-11
    关键字 git numpy
  • 你真的知道如何在Go中使用Git吗?
    在现代软件开发中,Git已经成为了最流行的版本控制系统之一。而Go语言则是一种相对新的编程语言,它具有简洁、高效和可靠等特点。对于大多数Go开发者来说,掌握如何在Go中使用Git是非常重要的。在本篇文章中,我们将深入探讨如何在Go中使用Gi...
    99+
    2023-10-12
    git shell 函数
  • 你真的掌握了Java教程中的对象容器吗?
    Java作为一种广泛使用的编程语言,在软件开发领域有着举足轻重的地位。其中,对象容器是Java中非常重要的一个概念,也是Java中非常常见的一种数据结构。然而,本文将深入介绍Java中的对象容器,帮助读者更好地理解和使用它们。 一、什么是对...
    99+
    2023-08-01
    教程 对象 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作