(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语言 ...
随机推荐
- Day4-A-最短路 HDU2544
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助 ...
- leetcode813 Largest Sum of Averages
""" We partition a row of numbers A into at most K adjacent (non-empty) groups, then ...
- leetcode743 Network Delay Time
""" here are N network nodes, labelled 1 to N. Given times, a list of travel times as ...
- scikitlearn库中调用k-近邻算法的操作步骤
1.k近邻算法可以说是唯一一个没有训练过程的机器学习算法,它含有训练基础数据集,但是是一种没有模型的算法,为了将其和其他算法进行统一,我们把它的训练数据集当做它的模型本身.2.在scikitlearn ...
- 初级入门 --- web GL绘制点
" 万丈高楼平地起." 01基础知识 一.相关术语 图元 :WebGL 能够绘制的基本图形元素,包含三种:点.线段.三角形. 片元:可以理解为像素,像素着色阶段是在片元着色器中. ...
- 管理和安装 chart【转】
安装 chart 当我们觉得准备就绪,就可以安装 chart,Helm 支持四种安装方法: 安装仓库中的 chart,例如:helm install stable/nginx 通过 tar 包安装,例 ...
- vSphere HA 原理与配置
内容预览: 1. vSphere HA 概述 2. vSphere HA 提供的保护级别 3. vSphere HA运行原理 4. vSphere HA 故障支持场景 5. vSphere HA接入控 ...
- vux 中 this.$vux.loading undefined 的问题
时间:2018-04-03 摘要:this.$vux.loading 报 undefined 今天在使用 事件触发 vux 的 loading 组件时,发现无法触发成功,显示 undefined 然 ...
- Spring组件扫描--源码跟踪
看这篇文章之前可以先了解之前的跟踪流程,https://www.jianshu.com/p/4934233f0ead 代码过宽,可以shift + 鼠标滚轮 左右滑动查看 这篇文章主要跟踪spring ...
- 3-安装RabbitMQ
1. 安装erlang 1.1 下载erlang http://www.erlang.org/downloads/20.1 yum -y install make ncurses-devel gcc ...