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堆被细分成一致大小的区域。这设置个体的细分的大小。这个参数的默认值由工学意义上的基于堆的大小决定