Java虚拟机中如何进行性能调优
Java虚拟机中如何进行性能调优
这篇文章的内容主要围绕Java虚拟机中如何进行性能调优进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!
一. 如何找到一个垃圾?
1)引用计数算法:给对象添加一个引用计数器,有一次引用,计数器值就加1;当引用失效时,计数器值就减1。很多流程的编程语言例如Python都使用这种方法管理内存,但是主流的Java虚拟机没有选用它,主要原因是它很难解决对象之间相互循环引用的问题。
2) 根可达性分析算法:因为引用计数算法无法解决对象之间相互循环引用的问题,继而引出了这个算法。思想是以GC Roots作为起始点开始向下搜索,所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链时,则这个对象是不可用的,就是垃圾。
二.找到一个垃圾后,如何清除它?
1) Mark-Sweep(标记清除):先标记出可回收的对象,然后清除。如下黑色部分为可回收对象,灰色部分为存活对象,绿色部分为未使用对象。
它的主要不足有两个:
1. 标记和清除两个过程的效率都不高
2. 另一个是空间的问题,标记清除之后产生了大量不连续的内存碎片,碎片会导致以后需要分配较大对象时,无法找到足够的连续内存,继而提前触发另一次垃圾收集动作。
2) Copying(拷贝):将内存划分为两块,将存活对象全部copy到下面的区域,然后把上面的全部清除。
新生代中的Survivor1和Survivor2就是这样的。
缺点:浪费内存
3) Mark-Compact(标记压缩或者标记整理):既不想碎片化,又不想浪费内存,就先将回收的对象标记起来,然后一边回收,一边把存活对象向一端移动。
缺点:效率偏低
3. CMS 全称 ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时进行,降低STW的时间(200ms),CMS问题很多,所以没有一个版本默认是CMS,只能手动设定。CMS既然是MarkSweep,就一定会有碎片化的问题,碎片达到一定的程度,CMS老年代分配对象分配不下的时候,使用Serial Old进行老年代回收。(面试重灾区)
主要有四个过程:
初始标记、并发标记、重新标记、并发清理
CMS的缺点是:产生了浮动垃圾,并且使用Serial Old来清理整个老年代,这是CMS设计的缺陷;但是如果CMS做好调优,支持的内存要比Parallel Old大的多。
想象一下:
PS + PO -> 加内存 换垃圾回收器 -> PN + CMS + Serial Old (几个小时-几天的STW) ,几十个G 的内存,单线程的回收 -> G1 + Full GC 几十个G -> 上T内存的服务器 ZGC
CMS并发标记采用的是: 三色标记法 + Incremental Update
4. G1 垃圾回收器 (200ms - 10 ms)
算法:三色标记 + SATB
由于越来越多的内存需要回收,必然会产生STW,所以G1应运而生。
逻辑分代,物理不分代。
4. ZGC (10ms - 1ms ) PKC++
算法:ColoredPointers + LoadBarrier
5. Shenandoah
算法:ColorPointers + WriteBarrier
CMS中新生代的默认年龄是6,PS/PO中新生代的默认年龄是15,进入老年代,可以通过参数:-XX:MaxTenuringThreshold配置
jdk1.0自带的Serial和Serial Old,现在用的最多的是Parallel Scavenge和Parallel Old,调优用的是ParNew和CMS,jdk1.8用G1也没有问题
jdk1.8默认是Parallel Scavenge和Parallel Old,不管是单线程Serial还是并行Parallel,只要人多,都会出现问题,所以就有了承前启后的ParNew和CMS。
Java的特点有哪些
Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
感谢你的阅读,相信你对“Java虚拟机中如何进行性能调优”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注恰卡编程网网站!小编会继续为大家带来更好的文章!