`
eric_weitm
  • 浏览: 235633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java invokedynamic和GC

    博客分类:
  • java
 
阅读更多

invokedynamic:java是静态类型语言,每一个函数调用一定是确定的映射到某个方法区,之后用解释器来执行;invokedynamic允许程序员指定,某个函数调用具体映射到哪个方法区(Callsite),可以实现根据数据类型的不同调用不同的指令(无类型的语言)。相应的Class文件的常量区里也设定了对应的字段。

jit:即时编译,有一个编译的过程,本身花费时间,同时表以后的体积膨胀很厉害,所以不是jit一定优于AOT

gc:针对堆和方法区

一、算法

1、标记-清除:大量碎片,效率低

2、复制:内存使用率低(只有50%)

3、标记-压缩:清除的同时,进行压缩

4、分代收集:FullGC太慢,可以分代。young代才需要频繁的GC。

年轻代存活时间短,进行复制清理;老年代执行标记-压缩。

 

二、具体实现:

1、串行收集器 -XX:+UseSerialGC 新生代复制算法、老年代标记-压缩

2、并行进行:新生代并行复制算法、老年代串行标记-压缩

-XX:+UseParNewGC  ParNew收集器

-XX:ParallelGCThreads 限制线程数量

3、并行

-XX:+UseParallelGC 自适应调节策略

-XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行

 

5、CMS(Concurrent Mark Sweep)最短停顿,缺点是内存碎片。

1》基本概念

堆内存是分区的,这样可以避免FullGC。

heap = young + old

young = Eden + 2个Survivor(分别叫from to)

PermGen(永久代):针对hotspot,存储class信息,jsp比较多时容易出现,string太多时,容易出现。

元空间: 替代permGen,使用native 内存

-XX:MetaspaceSize

-XX:MaxMetaspaceSize

 

Minor GC(stop the world):从Eden复制活的到to,from中还活的复制到to或老年代。to全满了,整个进入old。to和from交换。这时Eden和to都是清空的。

Full GC:清理整个堆空间—包括年轻代和老年代。

 

Full GC触发条件:

老年代达到一定比例或永久区满了,主动触发 System.gc;

 

2》过程:

初始标记(STW initial mark) root直接相关

并发标记(Concurrent marking) 向下扫描

并发预清理(Concurrent precleaning) 扫描新进入老年代的对象

重新标记(STW remark)

并发清理(Concurrent sweeping)

并发重置(Concurrent reset)

 

3》配置

-XX:+UseConcMarkSweepGC  使用CMS收集器

-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长

-XX:+CMSFullGCsBeforeCompaction  设置进行几次Full GC后,进行一次碎片整理

-XX:ParallelCMSThreads  设定CMS的线程数量(一般情况约等于可用CPU数量)

 

 

6、G1 garbage first 第一时间处理垃圾最多的区块。

1> 对CMS优化

整个堆不分固定的代,而是分为多个region,每个region可以动态的改变代;可指定停顿时间;并发回收时会压缩碎片

2》配置

-XX:+UseG1GC使用(G1,Garbage First)

-XX:MaxGCPauseMillis=n设置垃圾收集暂停时间最大值指标。这是一个软目标,Java虚拟机将尽最大努力实现它

-XX:InitiatingHeapOccupancyPercent=n触发并发垃圾收集周期的整个堆空间的占用比例。它被垃圾收集使用,用来触发并发垃圾收集周期,基于整个堆的占用情况,不只是一个代上(比如:G1)。0值 表示’do constant GC cycles’。默认是45

-XX:NewRatio=n年轻代与年老代的大小比例,默认值是2

-XX:SurvivorRatio=neden与survivor空间的大小比例,默认值8

-XX:MaxTenuringThreshold=n最大晋升阈值,默认值15

-XX:ParallerGCThreads=n设置垃圾收集器并行阶段的线程数量。默认值根据Java虚拟机运行的平台有所变化

-XX:ConcGCThreads=n并发垃圾收集器使用的线程数量,默认值根据Java虚拟机运行的平台有所变化

-XX:G1ReservePercent=n为了降低晋升失败机率设置一个假的堆的储备空间的上限大小,默认值是10

-XX:G1HeapRegionSize=n使用G1收集器,Java堆被细分成一致大小的区域。这设置个体的细分的大小。这个参数的默认值由工学意义上的基于堆的大小决定

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics