• 随性翻译: Java的运行时参数简单总结


    Java的运行时参数简单总结

    简单学习了下Oracle官方的资料:
    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDDFII
    之前也遇到了很多问题, 想着一起学习下jvm的参数.
    这里简单一边学习一遍翻译了一下
    不是很全面, 将自己最近用到的重要参数进行了寿命
    其他自己还没有用到的参数就没有列示, 我等菜鸡可以看这个, 高手直接看原文吧.
    

    Java参数分类

    正常运行一个Java程序比较简单, 直接java -jar 就可以运行. 
    但是如何长时间稳定高性能的运行程序就比较复杂, 需要关注比较多的内容
    java的参数也比较多,也有一些分类:
    1. 标准参数
    2. 非标准参数
    3. 高级运行时的参数
    4. 高级JIT相关的参数
    5. 高级系统监控服务类的参数
    6. 高级GC相关的参数.
    

    1. 标准参数

    -agentlib:jdwp=transport=dt_socket,server=y,address=8000
    #可以用来开放调试端口.
    -agentpath:pathname[=options]
    #可以将pathname里面的agent加载到内存里面
    -client    -server
    #客户端模式,或者是服务端模式.
    #client模式启动快,int模式多一些,jit少一些. 运行时效率低
    #server模式较早的进行了jit的介入,启动慢,但是运行效率好一些.
    -Dproperty=value
    #比如可以进行 -Dport=5201就可以运行时修改端口了. 
    

    2. 非标准参数

    -X
    # java -X 可以展示部分非标准参数.
    -Xms<size>        设置初始 Java 堆大小
    -Xmx<size>        设置最大 Java 堆大小
    -Xss<size>        设置 Java 线程堆栈大小
    # 注意一般情况下 -Xmx是memory max是 最大的heap内存大小
    # -Xms 是初始化最小的的heap内存大小 memory small
    # 注意以上两个参数,如果不设置的话: 默认最小内存是系统内存的六十四分之一,最大内存是四分之一.
    # 建议 最大内存和最小内存设置成一样大小, 这样可以避免jvm的内存缩减扩容影响性能.
    # Xss 是java线程的栈区大小, 注意一般中文翻译的 堆栈的说法总会让人产生误解. 
    # 需要注意 Xss的内存不是堆区管理的. 占用的总内存可以理解为 threads数*Xss的数值.
    # 栈区太大了会占用较多的内存,并且创建线程速度也会变慢, 但是如果太小,很容易出现stackoverflow.
    部分系统默认的栈区大小:
    Linux/ARM (32-bit): 320 KB
    Linux/i386 (32-bit): 320 KB
    Linux/x64 (64-bit): 1024 KB
    OS X (64-bit): 1024 KB
    Oracle Solaris/i386 (32-bit): 320 KB
    Oracle Solaris/x64 (64-bit): 1024 KB
    

    2.非标准参数

    -XX:NewRatio
    #-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
    # Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
    -XX:SurvivorRatio
    #设置为8,则两个Survivor区与一个Eden区的比值为2:8,
    #一个Survivor区占整个年轻代的1/10
    -Xbatch  # 禁用后台编译
    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -Xcomp            强制进行编译.
    # 注意可以使用这个参数设定 多少次的进行编译. -XX:CompileThreshold
    # 默认情况下 client 是1000次 server是10000次.
    -Xnoclassgc
    # 启用这两个参数后gc时将不会清理类对象,可能会出现内存浪费甚至内存泄漏问题,
    # 如果情况严重可能会填满持久代。
    -Xprof
    # 能够将jvm运行时的性能数据展示到标准输出,开发测试有效
    # 编译用于生产会影响性能.
    

    3. 高级运行时的参数

    -XX:ErrorFile=filename
    # 严重错误时能够将错误日志打印出来默认在当前运行时的路径.
    -XX:+FlightRecorder  -XX:-FlightRecorder
    # 使用启用FilghtRecorder + 表示启用 - 表示禁用.
    XX:LargePageSizeInBytes=size
    # 内存页面大小, 必须为2的幂, 一般不建议设置,容易出问题.
    -XX:MaxDirectMemorySize=size
    # nio 使用本地内存的大小,好像有一个64m的问题因这个导致.
    -XX:NativeMemoryTracking=mode
    #off summary detail 三种模式, 用于监控jvm的本地内存.
    -XX:+TraceClassLoading
    # 跟踪类的加载
    -XX:-UseCompressedOops
    # 不适用类指针压缩,一般32g一下的堆区自动之争压缩,32g以上不能使用.
    

    4. 高级JIT编译器的参数

    -XX:CICompilerCount=threads
    # 设置编译器的数量,server模式默认为2,client模式默认为1
    -XX:CodeCacheMinimumFreeSpace=size
    # 设置代码缓存吃的最小空闲空间. ARM上面code cache 好像跟x86不太一样.
    -XX:CompileThreshold=invocations
    # 设置默认编译的最小调用次数.
    -XX:+DoEscapeAnalysis
    # 逃逸分析, 如果确认不会被其他线程使用可以直接栈上分配内存.提高内存部署效率
    # 栈上分配能够使用寄存器,效率比物理内存(主内存)高两个数量级.
    -XX:InitialCodeCacheSize=size
    # CodeCache如果太小, 会影响性能, 导致方法只能int执行不能complie执行.
    -XX:ReservedCodeCacheSize=size
    # 可以开启分层加载, 会影响启动速度,但是有助于减少部分codecache的使用.
    

    5. 高级服务监控参数

    -XX:+HeapDumpOnOutOfMemoryError
    # 开发利器运维噩梦.磁盘会爆满,但是会保留犯罪现场,有助于排查问题.
    -XX:HeapDumpPath=path
    # 别跟应用在一起, 避免磁盘满了 业务停了.运维背锅.
    -XX:+PrintClassHistogram
    # 停止服务时打印类的统计图.
    

    6. 高级GC方面的参数

    -XX:ActiveProcessorCount=x
    # 感觉vm超售很严重时可能有些用处,不过是牺牲自己照亮别人.
    -XX:ConcGCThreads=threads
    # 并行GC的线程数..
    -XX:+DisableExplicitGC
    # 禁用了显示调用 system.gc() 如果有nio直接使用堆外内存的情况下,
    # 禁用了ExplicitGC可能会出现堆外内存异常.
    -XX:MaxRAMPercentage=percent
    # 之前说了默认值是 25, 如果是专用机器可以适当改成60甚至更高.
    # 但是注意还有堆外内存还有方法区,直接内存等,不要设置的太高.
    -XX:MaxTenuringThreshold=threshold
    # 好像存活多少次就会晋升到老年代的含义.并行GC默认15.CMS默认是6,最高值是15
    -XX:MetaspaceSize=size
    # 元空间的设置, jdk8没有了持久代的含义..
    -XX:ParallelGCThreads=threads
    # 默认值是CPU的个数, 所有有时候疯狂GC是CPU 就被占满了机器卡爆
    # 不知道能否设置成低于CPU的个数,保证部分业务使用.
    # fast failure的原理是需要尽快宕机的
    -XX:+PrintGC
    # 打印GC的信息.
    -XX:+PrintGCDateStamps
    -XX:+PrintGCDetails
    # 打印GC的时间戳和GC的详细信息
    -XX:TLABSize=size
    # 这个参数没玩过, 暂时不清楚 我理解成slab了..
    -XX:+UseGCOverheadLimit
    # 好像就是 98%堆内存无法被回收时直接干掉jvm显示为oom. fast failure
    -XX:+UseNUMA
    # NUMA 很多程序的痛苦..
    -XX:+UseParallelGC
    -XX:+UseParallelOldGC
    -XX:+UseParNewGC
    -XX:+UseSerialGC
    # 好多种不同的GC方式,需要验证再改,如果水平跟我差不多,就不要改默认.
    
  • 相关阅读:
    Linux系统下搭建Gitlab服务器
    Sqlserver数据库表转换成C#实体类
    C# 获取今天,昨天,上周,下周,上月,下月等等一些日期格式【转】
    Funthing
    网页生成海报
    NET 5.0 Swagger API 自动生成MarkDown文档
    说说C# 8.0 新增功能Index和Range的^0是什么?
    tblive-studio vs2019 编译过程记录
    确定已安装的 .NET Framework 版本
    修改CMD默认编码
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/16061336.html
Copyright © 2020-2023  润新知