🌕写在前面
🎈个人简介
- 🏡作者简介:大家好!我是orangemilk_。
- 🏆个人主页:orangemilk_
- 👉文章目的:解决现有的Java垃圾回收讲解晦涩难懂的问题,重视学习基础。
💌少年没有乌托邦,心向远方自明朗。
💌与风随行皆理想,遗憾最终皆幻想。
💐💐--往期精彩--💐💐
欢迎订阅本专栏
🎉 【Java篇】第一话-Java类的继承🎉 【Java篇】第二话-Object类的常用方法你学会了吗?🎉 【Java篇】第三话-你真的了解抽象类吗?🎉 【java篇】第四话-java接口详解🎉 【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中的内存空间,防止出现内存泄露和溢出问题。
版权归原作者 orangemilk_ 所有, 如有侵权,请联系我们删除。