大家好,我是皮卡,这次分享的是JAVA垃圾回收机制,如果有需要或是感兴趣的话,就一起看下去吧~

目录

一、手动垃圾回收机制

二、自动垃圾回收机制

1、概念

2、判断哪些对象有用

3、finalize方法——final、finally、finalize区别

4、触发垃圾回收的条件

5、java中的释放资源与垃圾回收机制区别

6、减少GC垃圾回收开销


一、手动垃圾回收机制(C/C++)

手动:使用过的对象必须要程序员自己来回收

缺点:

1⃣️若程序员忘记及时回收——对象会一直在内存中,若程序运行时间很长,内存中存在大量垃圾,空间越来越满,之后创建的对象没有内存可用——>导致内存泄漏、降低系统性能

2⃣️程序员自己回收可能存在误收操作——导致系统崩溃

二、自动垃圾回收机制(Java)

1、垃圾回收机制(GC):通过自动垃圾回收算法对堆内存中 new出的且不再被引用的对象 进行回收

2、垃圾回收机制如何判断对象是否还有用?

检查堆内存中空间是否充裕:

  • 足够,则不回收
  • 不足,通过算法检查是否有 已创建 且长时间未被引用的对象——>若长时间未被引用 且急需创建新的对象,垃圾回收机制就会将这些对象定为垃圾,会优先将这部分空间进行回收

3、垃圾回收机制在回收任何对象之前,总会先自动调用 finalize()方法(自动调用,不由程序员调用),调用该方法可以在垃圾回收同时打印日志等操作

注:finalize可以用来清理不是new出的对象所占用的内存,可以用来清理本地对象

本地对象:指的是在Java中调用非Java代码(C/C++)时创建的对象

 protected void finalize() throws Throwable { }

下面是我在一次面试中面试官问到我的问题,大家也可以看下~

final、finally、finalize的区别

final:修饰符,被final修饰的变量不能被修改,被final修饰的方法不能被重写,被final修饰的类不能被继承

finally:在异常处理时,用于最终进行收尾工作的代码块

finalize:Object中提供的方法,用于垃圾回收之前自动被垃圾回收器调用的方法

对象在内存中的状态转换【具体内容我们在下期分享】

4、触发垃圾回收的条件

  • 当没有线程在运行时,垃圾回收会被调用。因为垃圾回收在优先级最低的线程中进行,当应用忙时,垃圾回收不被调用(不是由程序员自己调用的),但除第二点
  • 堆内存不足时会触发垃圾回收机制

自动回收机制——>程序员无法精确控制垃圾回收的执行,可以通过System.gc() 或 Runtime.getRuntime().gc() 来通知JVM进行垃圾回收,但系统是否进行垃圾回收依旧不确定

public class TestGC {public static void main(String[] args) {TestGC testGC = new TestGC();testGC = null;System.gc(); // 通知垃圾回收器来回收垃圾,但是否进行垃圾回收依旧不确定,因为这不是程序员控制的}@Overrideprotected void finalize() throws Throwable {System.out.println("对象被GC回收");}
}

情况一:被回收

情况二:没有被回收

5、Java中释放资源与垃圾回收机制的区别

  • 垃圾回收只能释放内存中的资源,不能释放与内存无关的资源
  • 垃圾回收具有不确定性,程序员无法精确控制垃圾回收的执行,没有确定的回收时间
  • IO流资源不能被GC直接释放(IO流使用了虚拟机之外的资源,所以虚拟机无法通过垃圾回收释放资源),但可以通过finalize方法释放。该方法防止程序员忘记需要手动释放资源——依旧需要手动调用close方法释放资源。

上述说到finalize方法执行在垃圾回收机制之前,但垃圾回收机制具有不确定性,不确定什么时候进行垃圾回收。所以finalize方法无法保证对 手动需要释放的资源 进行及时回收。

protected void finalize() throws IOException {if ((fd != null) &&  (fd != FileDescriptor.in)) {/* if fd is shared, the references in FileDescriptor* will ensure that finalizer is only called when* safe to do so. All references using the fd have* become unreachable. We can call close()*/close();}}

6、减少GC垃圾回收开销

  • 尽量不要显式调用System.gc()

会增加GC的频率,但不能保证清除所有垃圾。GC也是一个线程,会消耗资源,可能会造成间歇性停顿次数(运行时是间歇进行的)。


好啦,就先到这里吧~
喜欢我的可以点赞、关注、收藏,如果有什么技术上的疑问,欢迎留言或私信~

我们下次见~

JAVA垃圾回收机制相关推荐

  1. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  2. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  3. java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法

    一.Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者 ...

  4. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  5. 深入理解 Java 垃圾回收机制

    转载自 http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java  语言中一个显著的特点就是引入 ...

  6. java垃圾回收机制的理解

    Java垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内存中 ...

  7. 【Java】Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  8. Java深度历险(四)——Java垃圾回收机制与引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

  9. axis2 webService开发 附深入理解 Java 垃圾回收机制

    相关文章: axis web服务(axis2安装和eclipse.tomcat结合开发) axis2 webService开发 axis2 webService开发(打包aar文件) 使用Axis2开 ...

  10. Java垃圾回收机制总结

    Java垃圾回收机制 垃圾回收(GC,Garbage Collection)是 Java 虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象所占据的内存空间的一种机制.注 ...

最新文章

  1. 第一篇:BPE算法(附加)
  2. 我的博客今天2岁104天了,我领取了…
  3. 【C#】C#创建Windows Service服务
  4. 不懂技术的人不要对懂技术的人说这很容易实现
  5. HAProxy的日志配置以及ACL规则实现负载均衡
  6. 智能车复工日记【N】:图像处理——环岛debug记录(持续更新)
  7. 进程控制 (二) Others
  8. 【软件架构】三层架构和MVC的比较
  9. Android自定义开机和关机动画
  10. php提取bing背景,PHP代码获取bing每日背景
  11. SpringBoot下Mybatis-注解动态sql开发的坑
  12. ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了
  13. android手机不能发短信,解决安卓手机发送短信失败的方法
  14. kdd99数据集svm分类_使用svm和不平衡的twitter数据集进行三级情感分类的任务
  15. 未经处理的异常:System.BadImageFormatException:“未能加载文件或程序集“GxIAPINET
  16. Java matlab车牌识别,车牌识别matlab实现(蓝色车牌和新能源车牌)
  17. 抖音,B站,小红书三大平台品牌投放特征与建议
  18. 616 java实现发红包案例
  19. nodejs中的__filename和__dirname的使用说明
  20. 【办公常用软件】万彩办公大师教程丨PDF合并工具帮助文档

热门文章

  1. 基于C++的Qt网络编程——聊天客户端
  2. php如何打包成apk,windows下PHP批量生成打包android程序APK
  3. java冷门小功能代码收集
  4. 市场需求分析报告及模板
  5. PADS2007教程(二)——PCB封装
  6. 漏洞分析C#反编译软件Reflector 11.1.0.2167(最新版)(附补丁下载)
  7. MFC框架学习:《深入浅出MFC》阅读笔记
  8. 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)
  9. 华工材料力学能用计算机吗,华南理工大学材料力学考研经验分享与资料.pdf
  10. excel首行空不能导入access_EXCEL数据无法导入ACCESS的解决办法