深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略
一、判断对象是否已死
1、垃圾收集器在对堆进行回收前,要先判断对象是否已死。而判断的算法有引用计数算法和可达性分析算法;
2、引用计数算法是给对象添加引用计数器,有地方引用就加1,当引用失效就减1,任何时刻计数器为0的对象就是不可能再被引用的。但是它很难解决对象之间相互循环引用。所以在主流的Java虚拟机里没有用引用计数算法来管理内存。
3、可达性分析算法是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。在Java语言中,可作为GC Roots的对象包括下面几种:虚拟机栈(栈帧中的本地变量表)中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。
4、引用在JDK1.2之后分为强引用,软引用,弱引用,需引用。
5、即使在可达性分析后不可达的对象也至少要经历两次标记过程,第一次是可达性分析后没有与GC Roots相关联的引用链,就会被标记进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么就被是为“没有必要执行”,如果执行的对象与引用链上的任何一个对象建立了关联即可拯救自己。
二、垃圾收集算法
1、标记-清除算法、标记-整理算法、复制算法、分代收集算法;
2、分代收集算法是根据对象存活周期的不同来划分为老年代和新生代(默认是15个周期);在新生代中因为有大量对象会死去所以采用的复制算法,在新生代区域中分为一个Eden和两个Survivor区域,新建对象分配到Eden和其中一个Survivor中,每次清理后将活着的对象复制到Survivor区域;HotSpot虚拟机的默认比例是8:1;而老年代中对象存活率高,一般采用标记-清除或者标记-整理算法来进行GC。
三、HotShot算法实现
1、枚举根节点:进行可达性分析,从可作为GC Roots的节点查找引用链,可达性分析时会产生GC停顿。并且使用OopMap的数据结构来使得虚拟机可以直接得知哪里存放着对象的引用。HotShot在安全点会停下进行GC。而为了让所有线程在安全点停顿,有两种方案,抢先式中断和主动式中断。还有安全区域概念。
四、垃圾收集器
1、Serial收集器时最基本、发展历史最悠久的收集器,单线程收集器。
2、ParNew收集器其实就是Serial收集器的多线程版本
3、Parallel Scavenge收集器是一个新生代收集器,它也是使用复制方法的收集器又是并行的多线程收集器。它不同于CMS等收集器的关注点是减少停顿时间,他的目标是达到一个可控制的吞吐量。
4、Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。
5、Parallel Old是Parallel Scavenge的老年代版本,使用多线程和“标记-整理”算法。
6、CMS收集器是一种以获取最短回收停顿时间为目标的收集器,使用“标记-清除”算法。
7、G1收集器是当今收集器技术发展的最前沿成果之一,G1具有以下特点:并行与并发;分代收集;空间整合;可预测的停顿。
五、内存分配与回收策略
1、在Serial/Serial Old收集器下,大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够内存是,发起一次Minor GC。
2、大对象直接进入老年代。通过-XX:pretenureSizeThreshold参数来设置对象大小的界限,这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制
3、长期存活的对象将进入老年代 默认经历过15次Minor GC后进入老年代
4、动态对象年龄判定如果在Survivor空间中相同的年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄
5、空间分配担保:发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,不安全的话会再计算之前每一次回收晋升到老年代对象容量的平均大小之作为经验值,与老年代的剩余空间进行比较,决定是否进行Full GC来让老年代腾出更多空间。
深入理解Java虚拟机--阅读笔记二的更多相关文章
- 深入理解Java虚拟机--阅读笔记一
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...
- 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- 深入理解Java虚拟机阅读心得(二)
垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有 ...
- 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化
线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...
- 深入理解JAVA虚拟机阅读笔记3——垃圾回收器
一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...
- 深入理解JAVA虚拟机阅读笔记2——垃圾回收
线程私有的程序计数器.虚拟机栈和本地方法栈随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈. 而Java堆和方法区因为需要多大内存.创建多少对象都是不确定的,因此这两个区域是垃 ...
随机推荐
- Android 四大组件之“ BroadcastReceiver ”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
- 【BZOJ1053】 反素数ant
BZOJ1053 反素数ant 我们先考虑唯一分解定理求出约数个数: \(x=a_1^{p_1}a_2^{p_2}a_3^{p_3}...a_k^{p_k}\) 然后\(num=\Pi_{i=1}^k ...
- C/C++掌握技能(一)
1.在编译器中输入代码并将其保存为.cpp文件(C语言的文件扩展名.c,但为了使用C++中的一些好用的特性,请把文件扩展名改为C++的.cpp)2.等价头文件:#include<stdio.h& ...
- WINDOWS平台下的栈溢出攻击从0到1(篇幅略长但非常值得一看)
到1的这个过程.笔者也希望能够通过这些技术分享帮助更多的朋友走入到二进制安全的领域中.2.文章拓扑由于本篇文章的篇幅略长,所以笔者在这里放一个文章的拓扑,让大家能够在开始阅读文章之前对整个文章的体系架 ...
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
- webApp开发中的总结
meta标签: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...
- Django模版语言自定义标签-实现前端 关联组合过滤查询
前端关联 组合过滤查询 实现效果如图: models.py 创建表代码 from django.db import models # Create your models here. class Le ...
- Kafka消息存储原理
kafka消息存储机制 (一)关键术语 复习一下几个基本概念,详见上面的基础知识文章. Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker能够组成一个Kafka ...
- DNF NPK包名对照一览表
文章转载自:http://bbs.exrpg.com/thread-107917-1-1.html ┌ sprite.NPK ...
- maven install 打包 报错 Cannot run program "gpg.exe": CreateProcess error
打包报错, mvn install后加上参数-Dgpg.skip,例如:mvn install -Dgpg.skip 即可解决. 我们也可以去掉 这个 插件 <plugin> ...