回顾上期

1)JVM中引用存在哪里?

答:虚拟机栈,该内存空间线程独有

2)该引用的对象存在哪里?

答:堆,所有通过new方法分配的对象都存在堆中

3)String s1="abc",字符串"abc"存在哪里?
答:运行时常量池,且常量池每次存储对象时会查找是否存过相等的对象,如果有,直接引用指向它,不再开辟空间。

如果你三个问题都可以回答出来,恭喜你!上一篇的精髓你get到了~~~~

引用的分类

1) 强引用,默认分配方式均为此类型

Object a=new Object();

2) 软引用,以强引用为参数,构造弱引用

Object a=new Object();
SoftReference<Object> b=new SoftReference<Object>(a);
a=null; //强引用a一定要断掉
System.out.println(b.get()); //通过get()方法返回对象

3) 弱引用

Object a=new Object();
WeakReference<Object> b=new WeakReference<Object>(a);
a=null; //强引用a一定要断掉
System.out.println(b.get()); //通过get()方法返回对象
System.gc();

4)幽灵引用,和没有引用是一样的

引用的特点

1)有强引用指向的对象不会被垃圾回收

2)软引用指向的对象在堆的空间不够时被回收

3)只要系统执行垃圾回收,就会回收软引用

从上面三点中,我们总结出垃圾回收是也是JVM中的一个线程,每执行一次,都要检查对象有没有强引用指向

如果没有再依次考虑软引用和弱引用

那么怎么检查呢?

代码分析

垃圾回收检查算法

1) 计数分析

每个对象,都给一个计数器,每增加一个强引用,就把计数器+1,如果当前计数器的值为0,就回收

思路很简单,但是会发生问题

Object a = new Object(); // a的引用计数为1
Object b = new Object(); // b的引用计数为1
 
a.next = b; // b的引用计数为2
b.next = a; // a的引用计数为2
 
a = null; // a的引用计数为1,尽管已经显示地将a赋值为null,但是由于引用计数为1,GC无法回收a
b = null; // b的引用计数为1,同理,GC也不回收b

2) 可达性分析

从GC Root往下搜索,如果该对象是可达的,找到到达该对象的最短路径

最短路径中的强度最弱的引用,决定了该对象是否被回收,如:

GC Root-(弱引用)->1对象-(强引用)->5对象

那么上述两个对象都是要被回收的

另外:GC Root 是什么?一些特殊的对象

虚拟机栈(栈帧中的本地变量表)中引用的对象,往往是方法中的一些简单类型变量

方法区中类静态属性引用的对象
方法区中常量引用的对象

(2) JVM内存管理:垃圾回收的更多相关文章

  1. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  2. python内存管理&垃圾回收

    python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...

  3. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  4. Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

    [转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...

  5. JVM内存管理------垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)

    引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...

  6. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

  7. [Python之路] 内存管理&垃圾回收

    一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...

  8. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  9. JVM内存管理------垃圾搜集器简介

    引言 上一章我们已经探讨过GC的各个算法,那么垃圾搜集器是什么呢? 通俗的讲,使用编程语言将算法实现出来,产生的程序就是垃圾搜集器了.既然谈到了编程语言的实现,那么在讨论垃圾搜集器的时候,就已经涉及到 ...

  10. JVM内存管理之垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

随机推荐

  1. 第一个Vue.js案例

    第一个Vue.js案例 使用Vue有如下几步 引入文件头 加入数据输出框 创建Vue对象,定义数据 案例: <!DOCTYPE html> <html lang="en&q ...

  2. 关于导出Excel表中存在部门或用户数据权限问题

    /** * 导出Controller */ @RequiresPermissions("xxx:weeklightlimit:download") @RequestMapping( ...

  3. 实训41 S7通信 单向连接 基于DP网络通信

    连接的基本概念? 连接是指两个通信伙伴之间执行通信服务建立的逻辑链路,而不是指两个站之间用物理媒体(例如电缆)实现的连接. 连接相当于 通信伙伴之间 一条虚拟的"专线". 一条物理 ...

  4. P1061 判断题

    P1061 判断题 转跳点:

  5. iOS 枚举ENUM和OPTIONS的区别

  6. springboot官网->pom.xml文件

    springboot 2.1.6 pom.xml

  7. python matplotlib绘图/sklearn包--make_blobs()

    1.make_bolbs() 函数 from sklearn.datasets.samples_generator import make_blobs import numpy as np impor ...

  8. other#apache-commons

    if you want to be a better javaer, you should  spent time on apache commons.

  9. mysql 模糊查询中包含特殊字符查询

  10. Linux下安装JDK及其碰到的问题解决

    1.下载一个linux版本的jdk包 2.新建一个目录,专门用来存放安装包 mkdir    /home/software 3.将jdk包拷贝到/home/software下面,并解压 4.配置jdk ...