垃圾回收相关概念

  • 一.System.gc() 的理解
    • 代码示例
      • GC1
      • GC2
      • GC3
      • GC4
      • GC5
  • 二.内存溢出与内存泄漏
    • 内存溢出(OOM)
    • 内存泄漏(Memory Leak)
      • 举例
  • 三.Stop The World
  • 四.垃圾回收的并行与并发
    • 并发(Concurrent)
    • 并行(Parallel)
    • 垃圾回收的并发与并行
  • 五.安全点与安全区域
    • 安全点(Safepoint)
    • 安全区域(Safe Region)
  • 六.再谈引用: 强引用
    • 强引用(Strong Reference) -- 不回收
  • 七.再谈引用: 软引用(Soft Reference) -- 内存不足即回收
  • 八.再谈引用: 弱引用(Weak Reference) -- 发现即回收
  • 九.再谈引用: 虚引用(Phantom Reference) -- 对象回收跟踪
  • 十.再谈引用: 终结器引用(Final reference)

一.System.gc() 的理解

public class SystemGCTest {public static void main(String[] args) {new SystemGCTest();//  就是调了这个 Runtime.getRuntime().gc();System.gc(); // 提醒jvm的垃圾回收器执行gc, 但是不确定是否马上执行gc// 强制调用使用引用的对象的finalize()方法// System.runFinalization();}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("重写了finalize().....");}
}

代码示例

/*** -XX:+PrintGCDetails*/
public class LocalVarGC {public void localvarGC1() {byte[] buffer = new byte[10 * 1024 * 1024];System.gc();}public void localvarGC2() {byte[] buffer = new byte[10 * 1024 * 1024];buffer = null;System.gc();}public void localvarGC3() {{byte[] buffer = new byte[10 * 1024 * 1024];}System.gc();}public void localvarGC4() {{byte[] buffer = new byte[10 * 1024 * 1024];}int value = 10;System.gc();}public void localvarGC5() {localvarGC1();System.gc();}public static void main(String[] args) {LocalVarGC local = new LocalVarGC();local.localvarGC1();}
}

GC1

GC2

GC3

GC4

GC5


二.内存溢出与内存泄漏

内存溢出(OOM)



内存泄漏(Memory Leak)

如下图右边有个应该断开的引用没有断开,就导致了内存的泄漏

举例

例子1: 比如Runtime对象,声明周期一直存在


三.Stop The World


public class StopTheWorldDemo {public static class WorkThread extends Thread {List<byte[]> list = new ArrayList<>();@Overridepublic void run() {try {while (true) {for (int i = 0; i < 1000; i++) {byte[] buffer = new byte[1024];list.add(buffer);}if (list.size() > 10000) {list.clear();System.gc(); // 会触发full GC, 进而会出现STW事件}}}catch (Exception e) {e.printStackTrace();}}}public static class PrintThread extends Thread {public final long startTime = System.currentTimeMillis();@Overridepublic void run() {try {while (true) {long end = System.currentTimeMillis() - startTime;System.out.println(end / 1000 + "." + end % 1000);Thread.sleep(1000);}}catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {WorkThread w = new WorkThread();PrintThread p = new PrintThread();w.start();p.start();}
}

四.垃圾回收的并行与并发

并发(Concurrent)

并行(Parallel)


垃圾回收的并发与并行



五.安全点与安全区域

安全点(Safepoint)


安全区域(Safe Region)



六.再谈引用: 强引用


强引用(Strong Reference) – 不回收





七.再谈引用: 软引用(Soft Reference) – 内存不足即回收


/*** -Xms10m -Xmx10m -XX:+PrintGCDetails*/
public class SoftReferenceTest {public static  class  User {public User(int id, String name) {this.id = id;this.name = name;}public int id;public String name;@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}}public static void main(String[] args) {// 创建对象, 建立软引用SoftReference<User> us = new SoftReference<>(new User(1, "胡琦"));/*      这段代码和上面的一句的作用是有一样的User huqi = new User(1, "huqi");SoftReference<User> userSoftReference = new SoftReference<>(huqi);huqi = null;*/// 从软引用中重新获得强引用对象System.out.println(us.get());System.gc();System.out.println("After GC : ");// 垃圾回收之后获得软引用中的对象System.out.println(us.get()); // 由于堆内存空间足够, 所以不会回收软引用的可达对象try {// 让系统以为内存资源紧张byte[] b = new byte[1024 * 1024 * 7];}catch (Throwable throwable) {throwable.printStackTrace();}finally {// 再次从软引用中获取数据System.out.println(us.get());// 在报OOM之前, 垃圾回收器会回收软引用的可达对象}}}


八.再谈引用: 弱引用(Weak Reference) – 发现即回收




关于weakHashMap可参考 https://blog.csdn.net/u013467442/article/details/105826778


九.再谈引用: 虚引用(Phantom Reference) – 对象回收跟踪


public class PhantomReferenceTest {/*** 当前类对象的声明*/public static PhantomReferenceTest obj;/*** 引用队列*/static ReferenceQueue<PhantomReferenceTest> phantomQueue = null;public static class CheckRefQueue extends Thread {@Overridepublic void run() {while (true) {// 当GC回收的时候将虚引用对象放入队列中的时候,会进入循环对队列进行操作if (phantomQueue != null) {PhantomReference<PhantomReferenceTest> objt = null;try {// 将队列中的元素取出来objt = (PhantomReference<PhantomReferenceTest>) phantomQueue.remove();} catch (InterruptedException e) {e.printStackTrace();}// 判断取出的元素,如果不为空就进行记录if (objt != null) {System.out.println("追踪垃圾回收过程: PhantomReferenceTest实例被GC了 -> " +JSON.toJSONString(objt));}}}}}@Overrideprotected void finalize() throws Throwable {System.out.println("调用当前类的finalize()方法");// 让当前对象复活obj = this;}public static void main(String[] args) {Thread t = new CheckRefQueue();// 设置为守护线程, 当程序中没有非守护线程时, 守护线程才会结束t.setDaemon(true);t.start();phantomQueue = new ReferenceQueue<>();obj = new PhantomReferenceTest();// 构造了 PhantomReferenceTest 对象的虚引用, 并指定了引用队列PhantomReference<PhantomReferenceTest> phantomReference = new PhantomReference<>(obj, phantomQueue);try {// 不可获取虚引用中的对象System.out.println(phantomReference.get());// 将强引用去除obj = null;// 第一次进行GC, 由于对象可复活, GC无法回收该对象System.gc();Thread.sleep(1000);if (obj == null) {System.out.println("obj 是 null");} else {System.out.println("obj 可用");}System.out.println("第二次gc");obj = null;// 一旦将obj对象回收, 就会将次虚引用存放到引用队列中System.gc();Thread.sleep(1000);if (obj == null) {System.out.println("obj 是 null");} else {System.out.println("obj 可用");}} catch (Exception e) {e.printStackTrace();}}
}


十.再谈引用: 终结器引用(Final reference)


JVM学习笔记(13) 垃圾回收-相关概念相关推荐

  1. JVM学习笔记之-垃圾回收相关概念 System.gc()的理解 内存溢出与内存泄漏 STW 垃圾回收的并行与并发 安全点与安全区域 再谈引用:强引用 软引用 弱引用 虚引用 终结器引用

    System.gc()的理解 在默认情况下,通过System.gc()或者Runtime. getRuntime ( ).gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...

  2. 【JVM学习笔记】垃圾回收基础篇

    今年就要去参加面试了,之前读完了<深入理解JAVA虚拟机>这本书,感觉并没有完全参透,现在重读这本书,希望能得到不一样的收获. 目录 Stop-The-World介绍 对象的年龄(垃圾分代 ...

  3. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  4. JVM学习笔记07-垃圾回收

    目录 1.垃圾回收概述 1.1.什么是垃圾 1.2.为什么需要GC 1.3.早起垃圾回收机制 2.垃圾回收的相关算法 2.1.标记阶段:引用计数算法 2.2.标记阶段:可达性分析算法 2.3.对象的f ...

  5. .NET深入学习笔记(3):垃圾回收与内存管理

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  6. JVM虚拟机-----垃圾回收相关概念

    12.垃圾回收相关概念 12.1 System.gc()的概念 在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对 ...

  7. JVM 垃圾回收相关概念

    垃圾回收相关概念 1-System.gc()的理解 在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生 ...

  8. JVM:垃圾回收相关概念

    文章目录 System.gc()的理解 内存溢出与内存泄漏 内存溢出(OOM) 内存泄漏(Memory Leak) Stop The World 垃圾回收的并行与并发 并发(Concurrent) 并 ...

  9. JVM 上篇(12):垃圾回收相关概念

    文章目录 System.gc() 的理解 案例:手动 GC 理解不可达对象的回收行为 1.调用 localvarGC1() 方法: 2.调用 localvarGC2() 方法 3.调用 localva ...

  10. JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT

    JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...

最新文章

  1. python命名空间更改_在Python中使用ElementTree改变命名空间前缀
  2. locks java_java中Locks的使用
  3. 虚拟化VMware之存储与虚拟机主机管理(1)
  4. 合并两个有序的单链表
  5. 地图索引 R-tree
  6. Nacos服务端流程图
  7. python实现程序安装_使用python实现对windows软件包的安装和卸载
  8. 帝国理工:如何用 AI 解决 80% 专科医生担忧的心律装置移植手术难题
  9. 新入行的包工头,一定做好下面几点
  10. JavaScript中匿名函数的困惑
  11. Python机器学习常用模块
  12. 音乐推荐系统参考资料
  13. 2009福布斯中国上市公司最佳CEO榜
  14. 小白软件测试入门基础--测试用例
  15. CSS砖头盖大楼(一)
  16. 520男生送什么礼物特别、2022特别礼物合集
  17. 【格式化文档】ISO 27001控制措施+ISO27002实施指南 【下】
  18. 蓝桥杯:小明用积木搭了一个城堡(积木)
  19. python语言标志位使用
  20. 安卓bochs模拟linux_安卓上的windows模拟器Bochs-安卓版pc电脑Windows模拟器(可安装电脑软件)下载V2.5.1最新手机版-西西软件下载...

热门文章

  1. vue项目集成金格WebOffice2015
  2. 复制神器Ditto使用方法详细说明
  3. 安卓手机里的“其他”为何占用如此多?我用adb+excel来处理
  4. 富途牛牛api_k牛刮毛是改善API的好方法
  5. Java:轻松一刻/程序员才懂的幽默
  6. 函数/极限/导数的概念辨析
  7. 又是一年毕业季,你拿什么打动面试官?
  8. php制作描述,CMS_phpcms下载频道的模板制作,关键字描述:制作 模板 quot l - phpStudy...
  9. win10网络适配器不见了_恢复消失的win10网络适配器的方法
  10. 【论文翻译】Flow-Guided Feature Aggregation for Video Object Detection