JVM虚拟机调优 (二)

七、Tomcat JVM优化

  1. Windows系统中修改环境变量
    在这里插入图片描述
    -verbose:gc -Xms1400m -Xmx1400m -XX:PermSize=400m
    -XX:MaxPermSize=400m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:\jvm.log

  2. Linux中在/etc/profile中加入
    Export -verbose:gc -Xms1400m -Xmx1400m -XX:PermSize=400m
    -XX:MaxPermSize=400m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:\jvm.log

八、垃圾回收算法

1、Mark-Sweep(标记-清除)

它是最基础的垃圾回收算法,其他算法都是基于这种思想。标记-清除算法分为“标记”,“清除”两个阶段:首先标记出需要回收的对象,标记完成后统一清除对象
在这里插入图片描述
缺点:

  1. 标记和清除的效率不高
  2. 标记之后会产生大量不连续的内存碎片

2、Copying(复制)算法

它将可用内存分为两块,每次只用其中的一块,当这块内存用完以后,将还存活的对象复制到另一块上面,然后再把已经使用的内存空间一次清理掉
在这里插入图片描述
优点:

  • 不会产生内存碎片
  • 只要移动堆顶的指针,按顺序分配内存即可,实现简单,运行高效

缺点:

  • 内存缩小为原来的一半

3、Mark-Compact(标记-整理)算法

标记操作和”标记-清除“算法一样,后续操作变成不直接清理对象,而是在清理无用对象的时候完成让所有存活的对象都像一端移动,并更新对象的指针
在这里插入图片描述
优点: 不会产生内存碎片

缺点: 在“标记-清除”基础上还要进行对象的移动,成本相对较高

4、Generational Collection(分代收集)算法(重点)

是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法

目前大部分垃圾收集器对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照1:1的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor空间中,然后清理掉Eden和刚才使用过的Survivor空间而由于老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法
注意,在堆区之外还有一个代就是永久代(Permanet Generation),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类

九、垃圾收集器

1、Parallel Scavenge(并行收集器)

Parallel Scavenge收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,它主要是为了达到一个可控的吞吐量

2、Parallel Old(年老代并行收集器)

Parallel Old是Parallel Scavnge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法

3、CMS(并发收集器)

CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法

4、G1

G1收集器是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型
上一篇:JVM虚拟机调优 (一)

猜你喜欢

转载自blog.csdn.net/qq_42806727/article/details/89011831