java篇】第六话-java垃圾回收浅析


目录

写在前面

知识点:Java语言的垃圾回收

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

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

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

总结

知识点:Java语言的垃圾回收

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

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

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

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

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

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

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

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

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

--分割线--

实例代码段:

Student stu = new Student("张 三",18);
Student stu2=stu;
stu=null;
stu2=new Student("李四",20);

思路:

--分割线--

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

//循环引用示例
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垃圾回收机制的特点

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

例如:

String str1="HelloWorld!";
String str2=str1;
str1=null;
str2=new String("HelloJava");

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

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

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

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

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

形式:

protected void finalize() throws Throwable

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

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

--分割线--

代码示例:

//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中的内存空间,防止出现内存泄露和溢出问题。


小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【111】即可免费获取































































版权声明:本文为CSDN博主「orangemilk_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

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

相关文章

教你用阿里云网盘做为存储介质实时同步本地文件夹

不会还有人不知道阿里云网盘不限速吧!!! 真不知道的话,你现在应也该知道了,既然有了这么良心的网盘,我们还不快搞点事情。通过阅读本文,可以实现:本地某个文件夹被修改(增加、删除、修改)了,自动将改变同...

3步搭建局域网公共网盘 其实你根本不需要NAS

工作中,经常有大量图片、视频、文件的存储与分享需求。以前,最简单的解决办法就是使用U盘拷贝,不仅效率慢,而且U盘传着传着就容易丢失。另外,U盘读写速度慢,如传输几十GB视频文件,仅拷贝可能就需要数小时...

9.5K star!ZFile:告别公共网盘!这款神器让你数据安全感爆棚!

「小墨是前端」专注分享前端技术,推荐优秀的开源项目,展示Github、Gitee上的创意作品,带你深入前端底层,一起成长。最近在做一些内部项目,需要一个简易的文件分享平台。不想搭建复杂的系统,又不想用...

2021最新Java学习视频400集,网盘自取,建议白嫖

Java一直是主流的编程语言,这里给大家整理了Java的入门学习视频,总共400集,超级适合小白学习。内容太多就不一一展示了,完整版网盘自取获取方式:关注+私信“学习”...

阿里内部重磅开源!读完这份20W字Java性能实战经验手册,最少P7

在当今的软件开发领域,性能优化一直是开发者们关注的焦点。特别是在大型互联网公司中,系统的性能直接影响到用户体验和业务效率。文档的结构为了帮助读者更好地学习和理解,手册采用了循序渐进的结构,分为以下几个...

3个简单步骤,让你在家中搭建一个私人百度云盘!

在现代数字时代,人们越来越多地依赖于云存储来保存和共享数据。然而,大多数云存储服务都需要付费订阅,而且对隐私的保护也不尽如人意。因此,许多人开始寻找一种更加安全、可靠且经济实惠的方式来存储和共享数据。...