当前jvm配置

  • -XX:+PrintFlagsInitial 查看初始

docker JAVA_OPTS

-XX:+AlwaysPreTouch 
    JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。
    1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间;
    2、可能存在内存碎片的问题。

    jvm启用会慢,JDK8版本以前都不是并行处理的,到了JDK9才是并行

    在没有配置-XX:+AlwaysPreTouch参数即默认情况下,JVM参数-Xms申明的堆只是在虚拟内存中分配,而不是在物理内存中分配:它被以一种内部数据结构的形式记录,从而避免被其他进程使用这些内存。这些内存页直到被访问时,才会在物理内存中分配。当JVM需要内存的时候,操作系统将根据需要分配内存页。

    配置-XX:+AlwaysPreTouch参数后,JVM将-Xms指定的堆内存中每个字节都写入'0',这样的话,除了在虚拟内存中以内部数据结构保留之外,还会在物理内存中分配。并且由于touch这个行为是单线程的,因此它将会让JVM进程启动变慢。所以,要么选择减少接下来对每个缓存页的第一次访问时间,要么选择减少JVM进程启动时间,这是一种trade-off。

-XX:AutoBoxCacheMax=20000 
   jvm启动加载rt.jar包的时候,其中IntegerCache会加载int的~128-128为Integer到cahce,其他范围的使用时会进行new Integer操作。所以建议设置到大一点。 一般设置20000。 
-XX:InitialHeapSize=523969984 
-XX:MaxHeapSize=8383519744 
-XX:+PrintCommandLineFlags 打印当前使用的参数
-XX:+PrintFlagsFinal 打印当前使用参数最终的值
-XX:+PrintGC  打印GC
-XX:+PrintGCApplicationStoppedTime :打印垃圾回收期间程序暂停的时间.
-XX:+PrintGCDateStamps :默认是+PrintGCTimeStamps打印jvm启动的相对时间,这个时间不利于查看,所以调整为系统时间
-XX:+PrintGCDetails : 打印gc详细的信息
-XX:+PrintGCTimeStamps :jvm启动的相对时间
-XX:+UnlockExperimentalVMOptions : 可保证你的Java进程不会因为内存问题被容器Kill
-XX:+UseCGroupMemoryLimitForHeap :感知CGroup的内存限制,防止容器被kill
-XX:+UseCompressedOops 
-XX:+UseCompressedClassPointers : 开启需要UseCompressedOops的支持,
    如果不开启普通对象指针压缩,-UseCompressedOops,会在内存中消耗24个字节,o 指针占8个字节,Object对象占16个字节。
    如果开启普通对象指针压缩,+UseCompressedOops,会在内存中消耗20个字节,o指针占4个字节,Object对象占16个字节。
-XX:+UseParallelGC: 指定垃圾收集器为并行收集器

压缩

  • -XX:+UseCompressedOops: 针对32位、64位系统占用空间不同,进行压缩,主要节省内存和缩短GC时间

    • new一个空对象在32为系统中占用内存大小是8byte(对象头,在堆中)+4byte(对象的引用地址,在栈中)=12byte
    • new一个空对象在64为系统中占用内存大小是16byte(对象头,在堆中)+8byte(对象的引用地址,在栈中)=24byte
    • 可想而知同一个对象在64位系统中占的内存加大一半了,不仅消耗运行内存,而且GC回收时挺耗cpu的。
    • jvm的属性-XX:+UseCompressedOops在JDK 1.6和之后的版本都默认开启了,所以jvm开启了压缩之后64为系统的对象也只占用12byte。
  • -XX:+UseCompressedClassPointers 类指针压缩

  • -XX:+ParallelRefProcEnabled参数来并行处理Reference

  • -XX:ParallelGCThreads:

     if ( ncpus  <=  8) {
        return ncpus;
     } else {
        return 8 + (ncpus - 8) * 5 / 8;
     }
    
    • -XX:+UseSpinning: 自旋