(2) JVM内存管理:垃圾回收
回顾上期
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内存管理:垃圾回收的更多相关文章
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- python内存管理&垃圾回收
python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...
- Java进阶 JVM 内存与垃圾回收篇(一)
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
- Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC
[转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...
- JVM内存管理------垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)
引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- [Python之路] 内存管理&垃圾回收
一.python源码 1.准备源码 下载Python源码:https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz 解压得到文件夹: 我们主要关 ...
- [CLR via C#]21. 自动内存管理(垃圾回收机制)
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...
- JVM内存管理------垃圾搜集器简介
引言 上一章我们已经探讨过GC的各个算法,那么垃圾搜集器是什么呢? 通俗的讲,使用编程语言将算法实现出来,产生的程序就是垃圾搜集器了.既然谈到了编程语言的实现,那么在讨论垃圾搜集器的时候,就已经涉及到 ...
- JVM内存管理之垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
随机推荐
- 第一个Vue.js案例
第一个Vue.js案例 使用Vue有如下几步 引入文件头 加入数据输出框 创建Vue对象,定义数据 案例: <!DOCTYPE html> <html lang="en&q ...
- 关于导出Excel表中存在部门或用户数据权限问题
/** * 导出Controller */ @RequiresPermissions("xxx:weeklightlimit:download") @RequestMapping( ...
- 实训41 S7通信 单向连接 基于DP网络通信
连接的基本概念? 连接是指两个通信伙伴之间执行通信服务建立的逻辑链路,而不是指两个站之间用物理媒体(例如电缆)实现的连接. 连接相当于 通信伙伴之间 一条虚拟的"专线". 一条物理 ...
- P1061 判断题
P1061 判断题 转跳点:
- iOS 枚举ENUM和OPTIONS的区别
- springboot官网->pom.xml文件
springboot 2.1.6 pom.xml
- python matplotlib绘图/sklearn包--make_blobs()
1.make_bolbs() 函数 from sklearn.datasets.samples_generator import make_blobs import numpy as np impor ...
- other#apache-commons
if you want to be a better javaer, you should spent time on apache commons.
- mysql 模糊查询中包含特殊字符查询
- Linux下安装JDK及其碰到的问题解决
1.下载一个linux版本的jdk包 2.新建一个目录,专门用来存放安装包 mkdir /home/software 3.将jdk包拷贝到/home/software下面,并解压 4.配置jdk ...