搜索

java垃圾回收

Oct 29, 2016 am 10:06 AM
java

在java中,当对象不存在任何引用的时候,它就成为了垃圾,如果不及时回收,释放内存,垃圾便会越积越多,最终out of memory!,jvm也就结束运行了。

    有人疑惑了:我们平时编码时并没有显示的进行对象的销毁,怎么程序跑的好好的?

    这就要谈到今天的主角,jvm的守护式线程GC,GC是一个垃圾回收器,按照一定的算法,不定时的进行垃圾对象的释放,同时进行内存碎片的整理,保证内存的高可用性,维持进程的正常运行。

  

    我们看下面的一段代码:

public class DemoDatatype {

public static void main(String[] args) {

new DemoDatatype();

System.gc();

System.out.println("over!");

}

@Override

protected void finalize() throws Throwable {

System.out.println("垃圾回收前的工作!");

super.finalize();

}

}

    程序输出:over!

    

    我们创建了一个对象“new DemoDatatype()”,由于没有引用,很快就变成了垃圾对象,但是它一定会被回收吗?至少上面的结果表明没有回收,因为jvm内存充足,不屑于劳师动众去回收你,我可是很耗费资源的^_^。

    

    java.lang.System类下有一个静态方法gc(),主动调用它,可以通知GC:嗨,我这有垃圾,快来帮忙收一下。但是,GC并不一定马上就能响应你的请求,可能半路堵车了,具体何时到达就不清楚了。执行gc()看一下结果:

    

public class DemoDatatype {

public static void main(String[] args) {

new DemoDatatype();

System.gc();

System.out.println("over!");

}

@Override

protected void finalize() throws Throwable {

System.out.println("垃圾回收前的工作!");

super.finalize();

}

}

        程序输出:over!

                          垃圾回收前的工作!

               或者:垃圾回收前的工作!

                          over!

    GC工作了,因为它很闲,所以及时响应了,但也不是立刻执行的,偶然事件。

    GC在进行垃圾回收前,执行了finalize()方法,我们知道,GC只认识那些通过new申请的对象,假如有一些内存是通过非正常手段开辟的,那么GC就蒙圈了。

    而finalize()的作用就是做一些垃圾回收前的资源释放工作,比如一些gc无法回收的资源,如“非new”内存,未关闭的IO等。但是一定不要寄希望于finalize()来释放资源,GC未必可达,会造成内存泄漏。

    

    GC在什么情况下才会触发呢?

    1)GC是守护线程,作为服务行业的一员,优先级最低,所以在应用空闲时,它才会启动。

    2)内存不足时,应用程序濒临死亡,GC会挺身而出,消灭垃圾,释放内存,若内存泄漏严重,jvm就会停止运行了。

    

    GC工作也会耗费系统资源,如何避免不必要的开销呢?

    1)不制造垃圾:减少使用临时对象;避无可避,使用完置空

    2)不主动请求GC:system.gc()不要显示调用

    3)明确生存周期的对象,主动销毁

    4)避免集中制造大量无用对象,如大量字符串拼接

    5)coding过程中注意内存泄漏,保证代码的严谨性。


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具