JVM 学习集合
内存回收要做的事:
确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC
以最简单的本地变量引用:Object obj = new Object()为例:
- Object obj表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据;
- new Object()作为实例对象数据存储在堆中;
- 堆中还记录了Object类的类型信息(接口、方法、field、对象类型等)的地址,这些地址所执行的数据存储在方法区中;

对象存活分析:引用计数、根搜索可达性
Java中GC Roots:
- 虚拟机栈中引用的对象。
- 方法区中静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中JNI引用的对象。
内存划分:

堆内存划分:
新创建的对象(除了对象大的超过阈值)一般先进新生代Eden区,这部分对象存活周期短,Eden区满则触发minor gc,活的复制到S0,清除其他,下一次minor gc,将Eden活的复制到S1, 清除其他,对于s0将符合晋级到Old区的对象复制到old区,其余活的复制到s1,清空s0.当复制次数达到-XX:MaxTenuringThreshold的对象,晋级到老年代 将Eden区和一个Survivor中仍然存活的对象拷贝到另一个Survivor中
对于Eden区,加快内存分配的方法:TLAB技术是对于多线程而言的,将Eden区分为若干段,每个线程使用独立的一段,避免相互影响。TLAB结合bump-the-pointer技术,将保证每个线程都使用Eden区的一段,并快速的分配内存。

老年代Old,一种是大小超过-XX:PretenureSizeThreshold配置的直接进入,还有就是minor gc次数超过-XX:MaxTenuringThreshold的对象
永久代:加载的类信息之类的,可以通过-verbose,-XX:+TraceClassLoading来跟踪
性能优化点:
可能存在年老代对象引用新生代对象的情况,如果需要执行Young GC,则可能需要查询整个老年代以确定是否可以清理回收,这显然是低效的。解决的方法是,年老代中维护一个512 byte的块——”card table“,所有老年代对象引用新生代对象的记录都记录在这里。Young GC时,只要查这里即可,不用再去查全部老年代,因此性能大大提高。
GC算法:
复制算法、标记清除、标记整理
垃圾收集器:
- 串行
- 新生代 -XX:+UseSerialGC ( Serial+Serial Old ) 暂停应用程序,单线程收集清理
- 老年代 Serial Old,单线程标记整理
- 并行
- -XX:+UseParNewGC ( ParNew+Serial Old ) 串行的多线程版本,关注垃圾收集时间, 新生代并行,复制算法,老年代串行,标记-压缩算法,-XX:ParallelGCThreads 线程数量。
- -XX:+UseParallelOldGC ( Parallel Scavenge+Serial Old ) 关注Cpu吞吐量,适合后台运算,-XX:GCTimeRatio设置用户时间比例,-XX:MaxGCPauseMillis设置最大停顿时间,-XX:+UseAdaptiveSizePolicy可以动态参数
- Parallel Old 与Parallel Scavenge配合有很好的效果,充分体现Parallel Scavenge收集器吞吐量优先的效果。使用-XX:+UseParallelOldGC开关控制使用Parallel Scavenge +Parallel Old组合收集器进行收集
- 并发 -XX:+UseConcMarkSweepGC ( ParNew+CMS+Serial Old ),-XX:+ UseCMSCompactAtFullCollection,最短停顿时间,分为初始标记,并发标记,重新标记,并发清理,通过将过程拆分,可以减少停顿时间,只有初始标记和重新标记需要短暂停顿,并发标记和并发清除都不需要暂停用户线程,因此效率很高,很适合高交互的场合,也可以设置是否在回收后是否进行碎片整理, 当old代达到了-XX:CMSInitiatingOccupancyFraction才开始清理,

- G1 内存划分为多个独立的区域,根据配置进行收集
分代收集不同代对应的可用垃圾收集器关系:

https://blog.csdn.net/hui_yan2012/article/details/70194449
http://www.importnew.com/1993.html
JVM 学习集合的更多相关文章
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- JVM学习笔记——字节码指令
JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- JVM学习——G1垃圾回收器(学习过程)
JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...
- JVM学习——垃圾回收GC(学习过程)
JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...
- JVM学习笔记——垃圾回收篇
JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...
随机推荐
- 廖雪峰Java5集合-2List-1使用List
1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...
- [UE4]手柄导航 Navigation
Navigation是对应游戏手柄.Left.Right.Up.Down.Next.Previous分别对应游戏手柄上的左.右.上.下.下一个.上一个按键. Left.Right.Up.Down.Ne ...
- [UE4]更通用的接口,将UserWidget作为图标添加到小地图
将图标改成UserWidget添加到小地图,UserWidget支持动画特效,更丰富小地图的功能. 一.在小地图图标结构体中,将Flag数据类型改成UserWidget,删除ImageWidget(类 ...
- arcgis for android 读取shp文件中文乱码解决方法
设置注册表默认字符,即可解决中文乱码问题. 'dbfDefault' 设置方法1.开始--运行,输入”Regedit“,打开注册表.2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ...
- web项目中添加MySQL驱动
1.我这里采用yml文件来配置,yml有配置层次清晰,方便操作的好处: 将application.properties后缀改成yml,即配置文件变成application.yml 我的applicat ...
- 必须熟练掌握的150个Linux命令
- 在Java中String类为什么要设计成final?String真的不可变吗?其他基本类型的包装类也是不可变的吗?
最近突然被问到String为什么被设计为不可变,当时有点懵,这个问题一直像bug一样存在,竟然没有发现,没有思考到,在此总结一下. 1.String的不可变String类被final修饰,是不可继承和 ...
- openstack cpu pinning
为了减少CPU竞争,提高CPU cache命中率,可以把guest的vcpu pin到host的物理CPU上. 在openstack中,可以添加以下到flavor extra specs: hw:cp ...
- Solr的Filed中indexed与stored属性
摘要: Solr的Filed中有很多参数,其中的index和store参数让人有点犯晕. 消失的Field <field name="description_s" type= ...
- ob系列函数中常用函数
ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面. ob_clean(); //删 ...