内存回收要做的事:

确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC

以最简单的本地变量引用:Object obj = new Object()为例:

  • Object obj表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据;
  • new Object()作为实例对象数据存储在堆中;
  • 堆中还记录了Object类的类型信息(接口、方法、field、对象类型等)的地址,这些地址所执行的数据存储在方法区中;

对象存活分析:引用计数、根搜索可达性

Java中GC Roots:

  1. 虚拟机栈中引用的对象。
  2. 方法区中静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中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算法:

复制算法、标记清除、标记整理

垃圾收集器:

  • 串行
  1. 新生代 -XX:+UseSerialGC ( Serial+Serial Old ) 暂停应用程序,单线程收集清理
  2. 老年代 Serial Old,单线程标记整理
  • 并行
  1. -XX:+UseParNewGC ( ParNew+Serial Old ) 串行的多线程版本,关注垃圾收集时间,  新生代并行,复制算法,老年代串行,标记-压缩算法,-XX:ParallelGCThreads 线程数量。
  2. -XX:+UseParallelOldGC ( Parallel Scavenge+Serial Old ) 关注Cpu吞吐量,适合后台运算,-XX:GCTimeRatio设置用户时间比例,-XX:MaxGCPauseMillis设置最大停顿时间,-XX:+UseAdaptiveSizePolicy可以动态参数
  3. 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 学习集合的更多相关文章

  1. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  4. JVM学习笔记——字节码指令

    JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...

  5. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  6. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  7. JVM学习——G1垃圾回收器(学习过程)

    JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...

  8. JVM学习——垃圾回收GC(学习过程)

    JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...

  9. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...

随机推荐

  1. jQuery中的跨域问题

    jQuery中的Ajax的跨域问题 jsonp跨域问题:回调函数中的字符串: cb或callback jsonpcallback:跟的是cb后面的函数,主要自己写: 数据中的函数fn(数据) 目前是这 ...

  2. Maven的classifier作用

    classifier可以是任意的字符串,用于拼接在GAV之后来确定指定的文件. 可用于区分不同jdk版本所生成的jar包 <dependency> <groupId>net.s ...

  3. [UE4]GameUserSettings

  4. phpStudy配置站点 解决You don't have permission to access / on this server

    1.配置站点:打开phpStudy->其他选项菜单->站点域名管理 2.配置站点:打开phpStudy->其他选项菜单->打开hosts 3.在apache的配置文件vhost ...

  5. Mybatis 系列10-结合源码解析mybatis 的执行流程

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  6. window.open打开新窗口报错ie 位指明错误,原因是window没有加引号!

    function JsMod(htmlurl,tmpWidth,tmpHeight){ htmlurl=getRandomUrl(htmlurl); var newwin = window.open( ...

  7. 面向对象javascript编程

    以构造函数的方式定义对象 function Person(name, age) { this.name = name; this.age = age; this.sayName = function ...

  8. Delphi2010如何获取程序内部自身版本号?

    用原来的GetFileVersionInfo只能获取Delpi7的程序版本号,用在Delphi2010中就不管用了 //------ 获取文件版本号function F_GetFileVersion( ...

  9. centos7 图形化界面

    当你安装centos服务器版本的时候,系统默认是不会安装 CentOS 的图形界面程序的,比如:gnome或者kde, 那么如果你想在图形界面下工作的话,可以手动来安装CentOS Gnome GUI ...

  10. thinkphp 5 wherein

    $details = Db::name('food') -> alias('a') -> field('a.food_code,a.food_name,a.food_u1,a.food_p ...