Java详细分析梳理垃圾回收机制
作者:orangemilk_ 发布时间:2023-10-30 04:02:33
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中的内存空间,防止出现内存泄露和溢出问题。
来源:https://blog.csdn.net/zhangxia_/article/details/124260320
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 太多的if-else不太直观,难以维护。 以下面代码为例,展示几种替代if else的方法。String input = &quo
- 介绍了图的最小生成树的概念,然后介绍了求最小生成树的两种算法:Prim算法和Kruskal算法的原理,最后提供了基于邻接矩阵和邻接链表的图对
- 在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。请看下方:深度克隆类:Java代码 import java.i
- @RequestMapping注解注意点类上加没加@RequestMappin注解区别1.如果类上加了 @RequestMappin注解,那
- summarydetail传统的Spring项目会有很多的配置文件,比如我们要使用Redis,一般除了对应的依赖的jar包我们还需要在app
- 引言备忘录模式经常可以遇到,譬如下面这些场景:浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退
- 什么是volatile关键字volatile是Java中用于修饰变量的关键字,其可以保证该变量的可见性以及顺序性,但是无法保证原子性。更准确
- 多线程的创建,方式一:继承于Thread类1.创建一个继承于Thread类的子类2.重写Thread类的run()--->将此线程执行
- 现假设某个公司采用公用电话来传递数据,数据是四位的整数,在传递过程中是加密的。加密规则是每位数字都加上5,然后再用除以10的余数代替该数字,
- 本文介绍了详解Maven * Nexus的安装与使用,分享给大家,具体如下:1.安装1.1 安装docker并加速yum update &am
- 假定存在这样一种情况多个用户对数据库进行写,我们的业务逻辑规定,每个用户只能写一次,大部分用户也只发一次请求。public void wri
- List list=new ArrayList()是怎么回事首先明确List是接口,ArrayList是它的实现类以下两种方法都可以,但是不
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- 1、#{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set
- 本文实例讲述了Java截取字符串的方法。分享给大家供大家参考。具体实现方法如下:public static void main(String
- 线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。设置线程优先级有助于帮助线程规划器
- 一、题目描述题目:使用ThreadLocal管理一号和二号线程,分别存入100元,在三号线程中使用利用一号和二号的计算结果来算出账户的实际金
- 注解是 JDK 5.0 引入的一种注释机制。注解可以作用在类型(类、接口、枚举等)、属性、方法、参数等不同位置,具体的 JDK
- 最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化编辑)、
- 判断参数是否为空并作为查询条件@Override public Page<DemandEntity>