朋友人妻系列在线阅读比如JMeter里2就弥散了

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 朋友人妻系列在线阅读比如JMeter里2就弥散了
    发布日期:2022-09-23 05:24    点击次数:166
    无料のAV工口动画朋友人妻系列在线阅读

    绪论

    -XX:+PrintFlagsFinal打印参数值

    当你在网上兴冲冲找到一个可优化的参数时,先打印望望,它可能也曾默许掀开了,再找到一个,照旧默许掀开了...

    JDK7与JDK8,以致JDK7中的不同小版块,有些参数值都不一样,是以不要轻信网上任何著述,一切以坐褥环境同版块的JDK打出来的为准。

    时时以雷同底下的语句去检讨参数,偷懒不起欺诈,用-version代替。有些参数建造后会影响其他参数,是以也得带上。

    java -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep GCThreads 

    关于不同版块里的默许值,建议是趁势而为,JDK在阿谁版块默许掀开不掀开总有它的意义。安全第一,莫得很好的因由,不要纵欲因为网上某篇著述的保举(包括你咫尺在读的这篇)就去建造。

     

    1. 性能篇

    1.1 建议的性能参数

    1. 取消偏向锁: -XX:-UseBiasedLocking

    JDK1.6开头默许掀开的偏向锁,会尝试把锁赋给第一个侦查它的线程,取消同步块上的synchronized原语。如若历久只好一条线程在侦查它,就凯旋略过同步操作以得回性能提高。

    但一朝有第二条线程侦查这把锁,JVM就要撤销偏向锁复原之前的状态,如若掀开安全点日记,不错看到不少RevokeBiasd的记录,像GC一样Stop The World的干活,诚然仅仅很短的停顿,但关于多线程并发的欺诈,取消掉它反而有性能的提高,是以Cassandra就取消了它。

    2. 加大Integer Cache: -XX:AutoBoxCacheMax=20000

    Integer i=3;这语句有着 int自动装箱成Integer的历程,JDK默许只缓存 -128 ~ +127的Integer 和 Long,超出范畴的数字就要即时构建新的Integer对象。设为20000后,咱们欺诈的QPS有足足4%的提高。为什么是2万呢,因为-XX:+AggressiveOpts里亦然这个值。详见《Java Integer(-128~127)值的==和equals比拟产生的思考》。

    3. 启动时侦查并置零内存页面: -XX:+AlwaysPreTouch

    启动时就把参数里说好了的内存一道舔一遍,可能令得启动时慢上极少,但后头侦查时会更流通,比如页面会联结分拨,比如不会在晋升须生代时才去侦查页面使得GC停顿期间加长。ElasticSearch和Cassandra都掀开了它。

    4. SecureRandom生成加快: -Djava.security.egd=file:/dev/./urandom

    此江湖偏方原因是Tomcat的SecureRandom显式使用SHA1PRNG算法时,开头因子默许从/dev/random读取会存在堵塞。额外铁心是SecureRandom的默许算法也变成更稳妥的SHA1了。详见 《SecureRandom的江湖偏方与着实铁心》

    1.2 可选的性能参数

    1. -XX:+PerfDisableSharedMem

    Cassandra家的一个参数,一直没属意,直到发生高IO时的JVM停顿。原来JVM时时会缄默的在/tmp/hperf 目次写上极少statistics数据,如若刚好遭逢PageCache刷盘,把文献结巴了,就不行兑现这个Stop the World的安全点了。

    退却JVM写statistics数据的代价,是jps和jstat 用不了,只可用JMX,而JMX取新须生代的使用百分比还真没jstat浅显,VJTools的vjmxcli弥补了这极少。详见《The Four Month Bug: JVM statistics cause garbage collection pauses》

    2. -XX:-UseCounterDecay

    退却JIT调用计数器衰减。默许情况下,每次GC时会对调用计数器进行砍半的操作,导致有些设施一直温热,永远都够不上触发C2编译的1万次的阀值。

    3. -XX:-TieredCompilation

    多层编译是JDK8后默许掀开的比拟高慢的功能,先以C1静态编译,采样弥散后C2编译。

    但咱们实测,性能最终略降2%,可能是因为有些设施C1编译后C2不再编译了。欺诈启动时的偶发就业超时也多了,可能是忙于编译。是以咱们将它退却了,但记起掀开前边的-XX:-UseCounterDecay,幸免有些温热的设施永远都要解释实验。

    1.3 不建议的性能参数

    1. -XX:+AggressiveOpts

    一些还没默许掀开的优化参数聚首, -XX:AutoBoxCacheMax是其中的一项。但如前所述,要津系统里不建议掀开。诚然通过-XX:+AggressiveOpts 与 -XX:-AggressiveOpts 的对比,咫尺才改变了三个参数,但为免以后某个版块的JDK里缄默改变更多激进的确立,照旧不要掀开了。

    2. JIT Compile干系的参数,函数调用些许次之后开头编译的阀值,内联函数大小的阀值等等,不要乱改。

    3. -server,在64位多核的linux中,你想设成-client都不行的,是以写了亦然白写。

     

    2. 内存与GC篇

    2.1 GC政策

    为了庄重,照旧8G以下的堆照旧CMS好了,G1咫尺诚然是默许了,但其实在小堆里的施展也莫得比CMS好,照旧JDK11的ZGC引人期待。

    1.CMS基本写法

    -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly 

    因为咱们的监控系统和会过JMX监控内存达到90%的景况,是以建造让它75%就开头跑了,早点开头也能减少Full GC等无意情况(成见重申,这种主动的CMS GC,和JVM的须生代、长期代、堆外内存完全不行分拨内存了而强制Full GC是不同的成见)。为了让这个建造成效,还要建造

    UseCMSInitiatingOccupancyOnly,否则75%只被用来做开头的参考值,自后照旧JVM我方算。

    2. -XX:MaxTenuringThreshold=2

    这是蜕变铁心最较着的一个参数了。对象在Survivor区最多熬过些许次Young GC后晋升到苍老代,JDK8里CMS 默许是6,其他如G1是15。

    Young GC是最大的欺诈停顿来源,而YGC后存活对象的些许又径直影响停顿的期间,是以如若了了Young GC的实验频率和欺诈里大部分临时对象的最长人命周期,不错把它设的更短极少,让其实不是临时对象的腾达代对象赶快晋升到苍老代,别呆着。

    用-XX:+PrintTenuringDistribution知悉下,如若后头几代的大小老是差未几,讲解过了某个年事后的对象总能晋升到须生代,就不错把晋升阈值设小,比如JMeter里2就弥散了。

    3. -XX:+

    ExplicitGCInvokesConcurrent 但不要加-XX:+DisableExplicitGC

    让full gc时使用CMS算法,不是全程停顿,必选。

    但像R大说的,System GC是保护机制(如堆外内存满时算帐它的堆内援用对象),禁了system.gc() 就怕是功德,99re热最新地址只须没用什么罕见烂的类库,真有人调了总有调的原因,是以不应该加这个烂大街的参数。

    4. -XX:+ParallelRefProcEnabled 和 -XX:+

    CMSParallelInitialMarkEnabled

    并行的解决Reference对象,如WeakReference,默许为false,除非在GC log里出现Reference解决期间较长的日记,否则铁心不会很较着,但咱们老是要JVM尽量的并行,是以设了也就设了。同理还有-XX:+

    CMSParallelInitialMarkEnabled,JDK8已默许开启,但小版块比拟低的JDK7以致不赞助。

    5. ParGCCardsPerStrideChunk

    Linkined的黑科技, 2016版不建议掀开,自后发现存些场景的确能减少YGC期间,详见《难道他们说的都是确凿》,约略说便是影响YGC时扫描须生代的期间,默许值256太小了,但32K也就怕对,需要我方磨炼。

    -XX:+UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk=1024

    2.2 可选的GC参数

    1. 并发蚁集线程数

    ParallelGCThreads=8+( Processor - 8 ) ( 5/8 );ConcGCThreads = (ParallelGCThreads + 3)/4 

    比如双CPU,六核,超线程便是24个解决器,小于8个解决器时ParallelGCThreads按解决器数目,大于时按上述公式YGC线程数=18, CMS GC线程数=5。

    CMS GC线程数的公式太怪,也有人建议约略改为YGC线程数的1/2。

    一些不在乎停顿期间的后台辅助阵势,比如日记蚁集的logstash,建议把它减少到2,幸免在GC时倏得占用太多CPU核,影响主欺诈。

    而另一些并不独占就业器的欺诈,比如把握跑着一堆sidecar的,也建议减少YGC线程数。

    一个着实的案例,24核的就业器,默许18条YGC线程,因为把握有个吃力的Service Mesh Proxy在跑着,这18条线程并不行100%的抢到CPU,出现了不对理的慢GC,把线程数镌汰到12条反而更快了。 是以那些议论的把YGC线程数=CPU 核数的,平庸画虎类狗。

    2. -XX:-CMSClassUnloadingEnabled

    在CMS中算帐长期代中的逾期的Class而不比及Full GC,JDK7默许关闭而JDK8掀开。看我方情况,比如有莫得运看成态说话剧本如Groovy产生多数的临时类。它有时会大大加多CMS GC的暂停期间。是以如若新类加载并不频繁,这个参数照旧显式关闭的好。

    3. -XX:+CMSScavengeBeforeRemark

    默许为关闭,在CMS remark前,先实验一次minor GC将腾达代清掉,这样从须生代的对象援用到的腾达代对象的个数就少了,住手全寰宇的CMS remark阶段就短一些。但如若掀开了,会让一次YGC紧接着一次CMS GC,国产精品无码小视频使得停顿的总期间加长了。

    又一个着实案例,CMS GC的期间和腾达代的使用量成比例,腾达代较小时很快完成,腾达代快满时CMS GC的停顿期间越过2秒,这时候就照旧掀开了合算。

    2.3 不建议的GC参数

    1. -XX:+UseParNewGC

    用了CMS,腾达代蚁集默许便是它,无须我方设。

    2.-XX:CMSFullGCsBeforeCompaction

    默许为0,即每次Full GC都对须生代进行碎屑整理压缩。Full GC 不同于 须生代75%时触发的CMS GC,只在须生代达到100%,堆外内存满,须生代碎屑过大无法分拨空间给新晋升的大对象这些特殊情况里发生,是以设为每次都进行碎屑整理是稳妥的,详见此贴里R大的解释。

    3.-XX:+GCLockerInvokesConcurrent

    咱们犯过的错,不是所有Concurrent字样的参数都是好参数,加上之后,正本遇上JNI GCLocker只需要赔偿YGC就够的,变成要实验YGC + CMS GC了。

    2.4 内存大小的建造

    其实JVM除了显式建造的-Xmx堆内存,还有一堆其他占内存的场地(堆外内存,线程栈,长期代,二进制代码cache),在容量估计的时候要属意。

    要津业务系统的就业器上内存一般都是够的,是以尽管设得宽松点。

    1. -Xmx, -Xms,堆内存大小,2~4G均可。

    2. -Xmn or -XX:NewSize or -XX:NewRatio

    JDK默许腾达代占堆大小的1/3, 个人心爱把对半分, 因为增大腾达代能减少GC的频率,如若须生代里没些许历久对象的话,占2/3平庸太多了。不错用-Xmn 径直赋值(等于-XX:NewSize and -XX:MaxNewSize同值的缩写),或把NewRatio设为1来对半分。

    3. -XX: PermSize=128m -XX:MaxPermSize=512m (JDK7)-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m(JDK8)

    咫尺的欺诈有Hibernate/Spring这些闹腾的家伙AOP之后类都比拟多,不错一开头就把开头值从64M设到128M(否则第一次自动推广会酿成松弛3秒的JVM停顿),并设一个更大的Max值以求保障。

    JDK8的长生代险些可用完机器的所有内存,相同设一个128M的开头值,512M的最大值保护一下。

    2.5 其他内存大小的建造

    1. -Xss

    在堆除外,线程占用栈内存,默许每条线程为1M(夙昔是256K)。存放设施调用出参入参的栈,局部变量,标量替换后掉局部变量等,有人心爱把它设回256k如Cassandra,省俭内存并开更多线程,有人则会在遭逢恣意后把它再设大点,罕见是有很深的JSON领略之类的递归调用时。

    2. -XX:SurvivorRatio

    腾达代中每个存活区的大小,默许为8,即1/10的腾达代 1/(SurvivorRatio+2),有人心爱设小点省点给腾达代,但要幸免太小使得存活区放不下临时对象而被动晋升到须生代,照旧从GC日记里看骨子情况了。

    3. -XX:MaxDirectMemorySize

    堆外内存的最大值,默许为Heap区总内存减去一个Survivor区的大小,详见《Netty之堆外内存扫盲篇》,如若笃信用不了这样多,也不错把它主动设小,来得回一个比拟流露内存占用预估值,罕见是在容器里。

    4. -XX:ReservedCodeCacheSize

    JIT编译后二进制代码的存放区,满了之后就不再编译,对性能影响很大。 JDK7默许不开多层编译48M,开了96M,而JDK8默许开多层编译240M。不错在JMX里望望CodeCache的占用情况,也不错用VJTools里的vjtop来看,JDK7下默许的48M不错设大点,不抠这样点。

     

    3. 监控篇

    JVM输出的多样日记,如若未指定旅途,平庸会生成到运行欺诈的相通目次,为了幸免有时候在不同的场地实验启动剧本,一般将日记旅途纠合设到一个固定的场地。

    3.1 监控建议确立

    1. -XX:+PrintCommandLineFlags

    运维有时会对启动参数做一些临时的改革,将每次启动的参数输出到stdout,畴昔班班可考。打印出来的是号令行里建造了的参数以及因为这些参数隐式影响的参数,比如开了CMS后,-XX:+UseParNewGC也被自动掀开。

    2. -XX:-OmitStackTraceInFastThrow

    为极端建造StackTrace是个腾贵的操作,是以当欺诈在相通场地抛出相通的极端N次(两万?)之后,JVM会对某些特定极端如NPE,数组越界等进行优化,不再带上极端栈。此时,你可能会看到日记里一条条Nul Point Exception,而之前输出圆善栈的日记早被周折到不知那里去了,也就完全不领会这NPE发生在什么场地,欲哭无泪。 是以,将它退却吧,ElasticSearch也这样干。

    3.2 Crash文献

    1. -XX:ErrorFile

    JVM crash时,hotspot 会生成一个error文献,提供JVM状态信息的细节。如前所述,将其输出到固定目次,幸免到时会到处找这文献。文献名中的%p会被自动替换为欺诈的PID

    -XX:ErrorFile=${LOGDIR}/hs_err_%p.log

    2. coredump

    天然,更好的做法是生成coredump,从CoreDump八成转出Heap Dump 和 Thread Dump 还有crash的场地,相称实用。

    在启动剧本里加上 ulimit -c unlimited或其他的建造阵势,如若有root权限,设一下输出目次更好

    echo "/{MYLOGDIR}/coredump.%p" > /proc/sys/kernel/core_pattern

    什么?你不领会coredump有什么用?看来你是没遇过JVM Segment Fault的幸福人。

    3. -XX:+

    HeapDumpOnOutOfMemoryError(可选)

    在Out Of Memory,JVM快死掉的时候,输出Heap Dump到指定文献。否则开辟许多时候还真不领会怎样重现恣意。

    旅途只指向目次,JVM会保持文献名的独一性,叫java_pid${pid}.hprof。因为如若指向文献,而文献已存在,反而不行写入。

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/

    但在容器环境下,输出4G的HeapDump,在往常硬盘上会酿成20秒以上的硬盘IO跑满,亦然个完全的恶邻,影响了归并宿主机上所有其他的容器。

    3.3 GC日记

    JDK9完全不一样了,这里照旧写JDK7/8的确立。

    1.基本确立

    -Xloggc:/dev/shm/gc-myapp.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails 

    有人挂牵写GC日记会影响性能,但测试下来实在没什么影响,GC问题是Java里最常见的问题,没日记怎样行。

    自后又发现如若遇上高IO的情况,GC时操作系统正在flush pageCache 到磁盘的话,也可能导致GC log文献被锁住,从而让GC兑现不了。是以把它指向了/dev/shm 这种内存中语献系统,幸免这种停顿,详见《Eliminating Large JVM GC Pauses Caused by Background IO Traffic》

    用PrintGCDateStamps而不是PrintGCTimeStamps,打印可读的日历而不是期间戳。

    2. -XX:+PrintGCApplicationStoppedTime

    这是个相称相称蹙迫的参数,它的名字没起好,它除了打印流露的圆善的GC停顿期间外,还不错打印其他的JVM停顿期间,比如取消偏向锁,class 被agent redefine,code deoptimization等等,有助于发现一些原来没预想的问题,建议也加上。如若确凿发现了一些不知是什么的停顿,需要打印安全点日记找原因。

    3. -XX:+PrintGCCause

    打印产生GC的原因,比如AllocationFailure什么的,在JDK8已默许掀开,JDK7要显式掀开一下。

    4. -XX:+PrintPromotionFailure

    掀开了就领会是多大的腾达代对象晋升到须生代失败从而激发Full GC时的。

    5. GC日记周折与备份

    GC日记默许会在重启后清空,有人挂牵历久运行的欺诈会把文献弄得很大,是以"-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M"的参数不错让日记周折起来。但真用起来重启后的文献名太强大太让人头痛,GC日记再大也够不上那里去,是以咱们莫得加周折,况且自行在启动剧本里对旧日记做备份。

    3.4 安全点日记

    如若GC日记里有非GC的JVM停顿期间,你得打出安全点日记来领会确定,详见《 JVM的Stop The World,安全点,迷蒙的地底寰宇》

    -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=/dev/shm/vm-myapp.log 

    3.5 JMX

    -Dcom.sun.management.jmxremote.port=7001 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 

    以上建造,只让土产货的Zabbix之类监控软件通过JMX监控JVM,不允许辛勤侦查。

    如若欺诈健忘了加上述参数,又不想改参数重启就业,不错用VJTools的vjmxcli来济急,它能通过PID径直连入蓄意JVM掀开JMX。

     

    4. 小结

    谢谢大家看到这里,上文的所有内容,其实都在VJTools的 jvm-options.sh 内部了。