深入理解JAVA虚拟机阅读笔记2——垃圾回收
线程私有的程序计数器、虚拟机栈和本地方法栈随线程而生,随线程而灭。栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈。
而Java堆和方法区因为需要多大内存、创建多少对象都是不确定的,因此这两个区域是垃圾回收的重点对象。
一、如何判断对象是否存活
1. 引用计数法
给每个对象添加一个引用计数器,有一个地方引用就+1,引用失效就-1。计数器为0,即该对象无法被访问。
优点:实现简单,判断效率高。
缺点:难以解决对象之间的循环引用问题。
2. 可达性分析法
通过一系列“GC Roots”的对象作为起始点,向下搜索。判断是否可以通过"GC Roots"对象的引用链访问到对象。
可以作为“GC Roots”的对象:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中引用的对象
二、 Java中的4中不同程度的引用
强引用:new出的。只要强引用还在,永远不会被垃圾回收。
软引用:SoftRefference类来实现。系统将要发生内存溢出异常之前,将这些对象进行二次回收。
弱引用:WeakRefference类来实现。只能生存到下一个垃圾回收期。无论内存是否充足,都会回收。
虚引用:PhantomRefference类来实现。
三、 回收方法区
“废弃常量”
没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量。
“无用的类”
- 该类的所有实例都已被回收
- 加载该类的ClassLoader已经被回收
- 该类的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
四、垃圾收集算法
1. 标记 — 清除算法

首先标记出所有需要回收的对象
然后对标记完成的对象统一进行回收
缺点: 内存分配的效率很低,产生大量的内存碎片。
2. 复制算法
将内存分为两块,每次使用其中一块。垃圾回收时,将存活的对象复制到另一块上面,然后清理已使用过的内存空间。
优点:内存分配效率高,实现简单,运行高效。
缺点:内存浪费严重。
改进:新生代使用Eden,from,to( 8 : 1 : 1)


3. 标记 — 整理算法
先对所有对象进行标记,然后让存活对象都向一端移动。
4.分代收集算法
新生代使用 复制 算法
老年代使用 标记 — 整理 算法
深入理解JAVA虚拟机阅读笔记2——垃圾回收的更多相关文章
- 深入理解JAVA虚拟机阅读笔记3——垃圾回收器
一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...
- 深入理解Java虚拟机--阅读笔记一
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...
- 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- 深入理解Java虚拟机--阅读笔记三
垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...
随机推荐
- pycharm导入路径问题
博主在导入自定义模块式出现模块下有红色波浪线,如下: 例如from conf import setting 导入时会从当前目录下找找到youkuClient就不会再往下找了,所以引入模块的路径不能夸路 ...
- Object C学习笔记5-ARC forbids explicit message* 编译错误
在学习Object C的过程中XCode 编译器经常出现 "ARC forbids explicit message send of release" 的错误提示. 以上问题主要出 ...
- 简单可行的code review规则
前言 曾经有一段垃圾代码放在我的面前,我没有拒绝,等我真正开始接手的时候我才后悔莫及,程序员最痛苦的事莫过于此! 每当接手别人的代码,都有一种想重新写一遍的感觉,等到别人再来接手你的代码时,同样的感觉 ...
- WebGL——水波纹特效
大家好,今天我ccentry要做一个水波纹特效,我们来看看水波纹特效的做法.首先我们来看一下水波纹特效的效果是怎么样的,请看下图. 我们要做的就是类似这种纹理特效,那么我们来看看是如何制作的吧.首先鲫 ...
- 《杜增强讲Unity之Tanks坦克大战》6-发射子弹
6 发射子弹 本节完成发射子弹的功能,最终代码如下: image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...
- 【HDU】3555【Bomb】
题目链接 此题题意就是给你T个n,找出n以内的包含49的数的个数. 很裸的一题数位dp. 直接dp包含49的数的个数有点麻烦,所以我先算出不包含49的数的个数,然后用n+1来减(因为计算不包含49的数 ...
- xml解析数据信息并实现DBManager操作mysql
先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用xml封装起来 以至于我每次都只要修改一下我的 ...
- 使用proxyee-down解决百度云下载限速问题
1.在下面页面安装HTTP下载器 https://github.com/proxyee-down-org/proxyee-down#%E4%B8%8B%E8%BD%BD 2.安装switchy插件 h ...
- 微信小程序-帝国cms会员系统调用
在用户->管理会员字段,增加如下字段:openidsession_keylsktokennicknameheadimg设置用户名长度然后,在系统,系统变最设置,用户设置,将注册用户名设置长度改成 ...
- Redis源码阅读(四)集群-请求分配
Redis源码阅读(四)集群-请求分配 集群搭建好之后,用户发送的命令请求可以被分配到不同的节点去处理.那Redis对命令请求分配的依据是什么?如果节点数量有变动,命令又是如何重新分配的,重分配的过程 ...