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堆被细分成一致大小的区域。这设置个体的细分的大小。这个参数的默认值由工学意义上的基于堆的大小决定
相关推荐
Java垃圾回收GC机制
GC java 手册 kindle格式 GC java 手册 kindle格式 GC java 手册 kindle格式
java7 GC 参数配置说明文档,详细介绍了每个参数的作用
让你对java gc 的工作原理有更深的了解 谢谢下载
Java垃圾回收GC.xmind
NULL 博文链接:https://xdjava.iteye.com/blog/2031254
java虚拟机中gc的基本原理 .docx
GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...
Java基础[Java基础]--Java GC工作原理
GC有两种类型:Scavenge GC(也称Young GC)和Full GC。 一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面...
GCViewer 能否分析 java 程序 GC 日志,能否图表展示堆内存,年轻代,老年代,永久带以及full gc 的使用情况
一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的...
Java SE编程入门教程 java GC(共6页).pptx Java SE编程入门教程 java instanceof(共3页).pptx Java SE编程入门教程 java IO(共28页).pptx Java SE编程入门教程 java Math(共11页).pptx Java SE编程入门教程 ...
Java程序员必须了解GC的工作原理
Java VisualVM GC插件
java查看哪个进程频繁GC垃圾回收
NULL 博文链接:https://wangwengcn.iteye.com/blog/1606192
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
java -jar gcviewer_1.3.4.jar gc.log 或者 java -jar gcviewer_1.3.4.jar gc.log summary.csv chart.png 其中; gc.log 是截取的一部分样本日志文件; 建议使用你自己的日志。 GCViewer官网: ...
内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。...