• JVM参数配置


    堆参数设置

    -XX:+PrintGC
        使用这个参数,虚拟机启动后,只要遇到GC就会打印日志
    
    -XX:+PrintGCDetails
        可以查看详细信息,包括各个区的情况
    
    -XX:+PrintHeapAtGC
        打印 GC 前后的详细堆栈信息
    
    
    -Xms3550m(默认物理内存的64分之一)
        设置Java程序启动时初始化JVM堆内存大小
    
    -Xmx3550m(默认物理内存的4分之一)
        设置Java程序能获得最大JVM堆内存大小
    
    在实际工作中,我们可以直接将初始的堆大小与最大堆大小设置相等,这样的好处是可以减少程序运行时的垃圾回收次数,从而提高性能。
    
    
    -XX:+PrintFlagsInitial
        打印JVM初始化参数。
    
    -XX:+PrintFlagsFinal
        标记人为修改过的参数。
    
    -XX:+PrintCommandLineFlags
        查看默认垃圾回收器。
    

    新生代参数配置

    -XX:NewSize=5m
        设置新生代最小空间大小
    
    -XX:MaxNewSize=10m
        设置新生代最大空间大小
    
    -Xmn2g
        可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,
        新生代大小一般会设置整个堆空间的1/3。
    
    
    -XX:SurvivorRatio=8(默认)
        用来设置新生代中eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to。
        基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。
    
    -XX:NewRatio=2(默认)
        设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。
    

    对象进入老年代的参数配置

    -XX:MaxTenuringThreshold=15
        新生代每次GC之后如果对象没有被回收,则年龄加1,默认情况下为15
    

    堆溢出参数配置

    -XX:+HeapDumpOnOutOfMemoryError
        使用该参数可以在内存溢出时导出整个堆信息
    
    -XX:HeapDumpPath=D:/OOM.dump
        可以设置导出堆的存放路径。
    

    垃圾回收器

    串行垃圾回收器(单个垃圾回收线程,所有其他工作线程暂停:STW):
    
        -XX:+UseSerialGC(年轻代复制算法,年老代标记-整理算法)
            配置串行回收器,开启后新,老都是串行垃圾回收。
    
    串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。
    
    
    并行垃圾回收器(多个垃圾回收线程,所有其他工作线程暂停:STW):
    
        -XX:+UseParallelGC(复制算法)(与下面配置选择其中一个即可,可以互相激活)
        -XX:+UseParallelOldGC(标记-整理算法)
            配置年轻代,年老代垃圾收集方式为并行收集。 JDK6.0 支持对年老代并行收集。
    
        -XX:ParallelGCThreads=4
            配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
    
        -XX:+UseAdaptiveSizePolicy
            设置此选项后,并行收集器会自动选择年轻代区大小和相应的 Survivor 区比例,
            以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
    
        -XX:MaxGCPauseMillis=100
            设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
            ParallelGC 工作时,会调整 Java 堆大小或者其他的一些参数,尽可能的把停顿时间控制在 MaxGCPauseMillis 以内。
    
    并行收集器适合对吞吐量要求远远高于延迟要求的场合。
    (吞吐量:应用程序线程用时占程序总用时的比例,暂停时间:一个时间段内应用程序线程让与GC线程执行而完全暂停)
    
    
    并发垃圾回收器(并发-标记-清除算法)(多个垃圾回收线程,用户线程不暂停:CMS)(只针对年老代):
    
        -XX:+UseParNewGC(复制算法)(自动激活UseConcMarkSweepGC年老代并发垃圾回收器)(STW)
            选择新生代垃圾收集器为并行收集器。
    
        -XX:+UseConcMarkSweepGC(标记-清除算法)(自动激活UseParNewGC年轻代并发垃圾回收器)(CMS)
            设置年老代为并发收集。
            此回收器出错后,备用是Serial Old串行回收器,如果在回收完成之前堆内存耗尽,CMS回收失败。
    
        -XX:+UseCMSCompactAtFullCollection
            打开对年老代的压缩。可能会影响性能,但是可以消除碎片。参数指定每次 CMS 后进行一次碎片整理。
    
        -XX:CMSFullGCsBeforeCompaction=5
            由于并发收集器不对内存空间进行压缩、整理,
            所以运行一段时间以后会产生“碎片”,使得运行效率降低。
            此值设置运行多少次 GC 以后对内存空间进行压缩、整理。
    
        -XX:ParallelGCThreads=4
            指定 GC 工作线程数量。
    
        -XX:ParallelCMSThreads=4
            设定 CMS 并发线程数。
    
    CMS并发收集、低停顿。非常适合堆内存大、CPU核数多的服务器端应用。
    注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如web程序、b/s服务。
    
    
    G1垃圾回收器(年轻代垃圾回收会暂停所有其他线程:STW):
    
        年轻代的垃圾收集, 会发生stop the world。 在回收时所有的应用程序线程都会被暂停。通过多线程并行进行。
    
        收集器可以工作在young 区,也可以工作在 old 区。
    
        -XX:UseG1GC(并行+并发)(不会产生碎片)
            存储不需要物理上连续,只需要逻辑上连续。
    
        -XX:G1HeapRegionSize=n
            指定分区大小(1mb-32mb,必须是2的幂),默认2048个分区。
    
        -XX:MaxGCPauseMillis=100(单位毫秒)
            设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
            如果任何一次停顿超过这个设置值时,G1 就会尝试调整新生代和老年代的比例,调整堆大小,调整晋升年龄的手段,试图达到目标。
    
        -XX:GCPauseIntervalMillis=n
            设置停顿时间间隔。
    
        -XX:ParallelGCThreads=4
            由于是并行并发的,可以指定 GC 工作线程数量。
    
    G1的收集,年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。
    即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集)
    
    G1的应用场合往往堆内存都比较大,所以Full GC(可用内存不足时触发)的收集代价非常昂贵,应该避免Full GC的发生。
    
    G1能够独自管理整个Java堆,并行与并发,不会产生空间碎片,低停顿,可预测的停顿。
    

    栈参数配置

    -Xss1m(默认)
        来指定线程的最大栈空间
    

    方法区参数配置

    JDK1.2 ~ JDK6,使用永久代来实现方法区
    
    -XX:PermSize=64M
        设置永久代最小空间大小。
    
    -XX:MaxPermSize=64M(默认)
        如果系统运行时生产大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。
    
    
    Java8,元空间取代永久代
    
        存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的
        而元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
    
        存储内容不同,元空间存储类的元信息
        静态变量和常量池等并入堆中。
        相当于永久代的数据被分到了堆和元空间中。
    
    -XX:MetaspaceSize=128m(默认)
        初始化大小。
     
    -XX:MaxMetaspaceSize=128m
        JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。
    

    直接内存(堆外内存)参数配置

    -XX:MaxDirectMemorySize=64m
    
        该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory()。
    
        直接内存使用达到上限时,就会触发垃圾回收(Full GC),如果不能有效的释放空间,就会引起系统的OOM。
    
    
    注:heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收。
        direct ByteBuffer是通过jni在虚拟机外内存中分配的。
    
    
    堆外内存:
    
        生命周期中等或较长的对象,适合堆外内存。
    
        直接的文件拷贝操作,或者I/O操作,适合堆外内存:
            直接使用堆外内存就能少去资源从用户内存拷贝到系统内存的操作。
    

    堆外内存回收原理

    DirectByteBuffer是通过虚引用(Phantom Reference)来实现堆外内存的释放的:
        虚引用主要被用来跟踪对象被垃圾回收的状态,
        通过查看引用队列(ReferenceQueue)中是否包含对象所对应的虚引用来判断它是否即将被垃圾回收,从而采取行动。
        它并不被期待用来取得目标对象的引用。
    
    初始化DirectByteBuffer对象时,如果当前堆外内存的条件很苛刻时,会主动调用System.gc()强制执行Full GC。
    

    https://www.cnblogs.com/duanxz/p/6089485.html

    TLAB参数配置

    Thread Local Allocation Buffer即线程本地分配缓存:
        一个线程专用的内存分配区域,是为了加速对象分配对象而生的。
    
    每一个线程都会产生一个TLAB,该线程独享的工作区域,Java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。
    
    
    -XX:+UseTLAB(默认开启)
        使用TLAB
    
    -XX:TLABSize=64k(默认)
        设置TLAB初始化大小
    
    -XX:TLABRefillWasteFraction=64
        设置维护进入TLAB空间的单个对象大小,它是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆创建对象。
    
    -XX:+ResizeTLAB
        自调整TLABRefillWasteFraction阈值。
    
    -XX:+PrintTLAB
        查看TLAB信息
    

    参考

    https://blog.csdn.net/weixin_37195606/article/details/82805216

  • 相关阅读:
    react 把时间戳用new Date改为日期
    react-格式化日期
    react-2种方法写法
    React-router4简约教程
    react-addons-css-transition-group
    vue-一些易错点
    Js apply方法详解,及其apply()方法的妙用
    C++中的继承(3)作用域与重定义,赋值兼容规则
    C++中的继承(1) 继承方式
    vim中文帮助文档安装
  • 原文地址:https://www.cnblogs.com/loveer/p/11522493.html
Copyright © 2020-2023  润新知