JVM调优

来源:互联网 发布:上海游族网络待遇 编辑:程序博客网 时间:2024/06/10 22:53

本文内容

1 优化层面

2 JVM调优



1 优化层面

1.1 设计层面

系统的设计层面是要最先考虑的问题。一个糟糕的设计,会直接导致系统性能出现问题。

例如,对于支付宝和微信的红包系统,若设计出现问题,即便程序优秀、硬件强劲,也于事无补。反之,若设计良好,则事半功倍。


1.2 程序层面

在一个良好的设计下,程序本身的优劣就决定了性能的高低。高质量的代码会提高资源的利用率,减少不必要的操作,从而提升性能。


1.3 设置层面

排除设计和程序层面的原因,出现性能问题时,可以通过一些系统参数设置,以匹配现实情况,使得资源使用最优化,从而提升性能。


1.4 硬件层面

当上述三个层面都没有问题的时候,就要考虑扩展硬件设备了。



2 JVM调优(设置层面)

2.1 工作模式

2.1.1 client

占用内存小,启动速度快;

适合短时间运行。


2.1.2 server

与client模式相比,占用内存大,启动速度慢,但启动后,执行速度快;

适合长时间运行。


2.1.3 设置工作模式

配置文件:…/jdk/jre/lib/amd64/jvm.cfg


2.2 堆内存

2.2.1 Max Memory

-Xmx可用的最大内存数(Max Memory),即JVM可占用的内存上限。

通常,服务器是专机专用,除了运行指定的服务程序,一般情况下,不会同时运行其它的程序。

所以,预留部分内存给操作系统等必要程序,其余内存尽可能分配给JVM,以提高内存利用率和性能。


2.2.2 Total Memory & Virtual Memory

-Xms初始分配内存(Total Memory)。

其余作为伸缩区(Virtual Memory),即 Max Memory = Total Memory + Virtual Memory。

当初始分配的内存不足时,会从伸缩区申请部分内存,当可用内存充裕时,再将申请来的内存释放。

通常,服务器是专机专用,除了运行执行的服务程序,不会同时运行其它的程序。

所以,一般会将Total Memory设置与Max Memory相等,即不设置伸缩区,以减少从伸缩区申请和释放内存带来的开销。


2.2.3 Young Memory (Eden + Survivor) &Tenured Memory

-Xmn年轻代内存(Young Memory)-XX:SurvivorRatio=n伊甸园与存活代的内存比率(Eden:Survivor)-XX:NewSize=n存活代内存(Survivor Memory)-XX:NewRatio=n年轻代与老年代的内存比率(Young:Tenured)-XX:PretenureSIzeThreshold=n直接晋升老年代的对象大小-XX:+UseAdaptiveSizePolicy是否采用动态控制策略(堆中各区域大小及晋升老年代的年龄)

新创建的对象都会保存在Young Memory的Eden Memory中,满足一定条件的对象会被移至Young Memory的Survivor Memory中,进而再晋级至Tenured Memory中。

因此,需要根据程序实际运行情况,合理设置相应内存数值和比率。


2.2.4 Thread Memory

-Xss每个线程分配的堆栈内存,JDK 5.0以后,每个线程堆栈大小默认为1M。

降低单个线程的堆栈内存,可以提高可并发的线程数量。

但是,线程数量有一定限制(上限),不能无限上涨。

应合理设置线程堆栈内存,通常,将线程数控制在3000-5000范围内。


2.2.5 Meta Space Memory

-XX:MaxMetaspaceSize最大容量,默认无限制(受到本机物理内存限制)-XX:MetaspaceSize初始分配容量-XX:MinMetaspaceFreeRatio执行GC后,最小剩余元空间比例。-XX:MaxMetaspaceFreeRatio执行GC后,最大剩余元空间比例。

2.2 回收机制

-XX:+UseSerialGCSerialCopying & Serial MSC-XX:+UseParallelGCParallel Scavenge & Parallel MarkSweep/Parallel Compating-XX:+UseParalledlOldGCParallel Scavenge & Parallel MarkSweep/Parallel Compating-XX:+UseConcMarkSweepGCParNew & Concurrent Mark-Sweep GC/CMSGC-XX:ParallelGCThreads=n设置并行收集器使用的CPU数量-XX:MaxGCPauseMillis=n设置并行收集器的最大暂停时间(毫秒)-XX:GCTimeRatio=n设置垃圾回收时间占程序运行时间的百分比-XX:+CMSIncrementalMode设置为增量模式,适用于单CPU情况。

2.3 统计信息

2.3.1 GC

-XX:+PrintGC每次触发GC的时候打印相关日志-XX:+PrintGCDetails更详细的GC日志-XX:+PrintHeapAtGC每次GC时打印堆的详细详细信息-XX:+PrintGCApplicationConcurrentTime打印应用程序执行时间-XX:+PrintGCApplicationAtoppedTime打印应用程序由GC引起的停顿时间-XX:+PrintReferenceGC跟踪系统内的软引用,弱引用,虚引用和finallize队列。

2.3.2 类跟踪

-verbose:class跟踪类的加载和卸载-XX:+TraceClassLoading单独跟踪类加载-XX:+TraceClassUnloading单独跟踪类卸载-XX:+PrintClassHistogram查看运行时类的分布情况
原创粉丝点击