zoukankan      html  css  js  c++  java
  • JVM 学习集合

    内存回收要做的事:

    确定哪些内存需要回收,确定什么时候需要执行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

  • 相关阅读:
    字符串 列表 元组 字典 集合3.4列表
    判断语句和循环语句2.12 for循环
    字符串 列表 元组 字典 集合3.3字符串常见操作
    判断语句和循环语句2.13 break和continue
    字符串 列表 元组 字典 集合3.5列表的常见操作
    c#生成json类
    JQuery UI Datepicker中文显示的方法
    ReportViewer无法直接打印的问题
    C++与SQL数据库 使用基础
    WM 6.0 中的设备控制启用设备与禁用设备
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9308769.html
Copyright © 2011-2022 走看看