如何调优 JVM - 优化 Java 虚拟机(大全+
实例) 收藏
堆设置
-Xmx3550m:设置 JVM
最大堆内存 为 3550M
。
-Xms3550m:设置 JVM
初始堆内存 为 3550M。此值可以设置与-Xmx 相同,以避免每
次垃圾回收完成后 JVM
重新分配内存。
-Xss128k
:设置每个线程的栈 大小。JDK5.0 以后每个线程栈大小为 1M,之前每个线
程栈大小为 256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,
减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不
能无限生成,经验值在 3000~5000
左右。
-Xmn2g
:设置堆内存年轻代 大小为 2G
。整个堆内存大小 =
年轻代大小 + 年老代大小
+
持久代大小 。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大
小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8
。
-XX:PermSize=256M
:设置堆内存持久代 初始值为 256M。(貌似是 Eclipse 等 IDE 的
初始化参数)
-XX:MaxNewSize=size
:新生成的对象能占用内存的最大值。
-XX:MaxPermSize=512M:设置持久代最大值为 512M
。
-XX:NewRatio=4:设置堆内存年轻代(包括 Eden 和两个 Survivor 区)与堆内存年老
代的比值(除去持久代) 。设置为 4,则年轻代所占与年老代所占的比值为 1:4
。
-XX:SurvivorRatio=4:设置堆内存年轻代中 Eden 区与 Survivor
区大小的比值 。设置
为 4,则两个 Survivor 区(JVM 堆内存年轻代中默认有 2 个 Survivor 区)与一个 Eden
区的比值为 2:4,一个 Survivor 区占整个年轻代的 1/6
。
-XX:MaxTenuringThreshold=7:表示一个对象如果在救助空间(Survivor 区)移动 7
次还没有被回收就放入年老代。
如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代,对于年老代比
较多的应用,这样做可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以
增加对象在年轻代存活时间,增加对象在年轻代即被回收的概率。
回收器选择
JVM 给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于
小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
默认情况下,JDK5.0 以前都是使用串行收集器,如果想使用其他收集器需要在启动时加
入相应参数。JDK5.0 以后,JVM 会根据当前系统配置进行智能判断。
串行收集器
-XX:+UseSerialGC
:设置串行收集器
并行收集器(吞吐量优先)
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述
配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进
行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0 支持对年老
代并行收集。
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间(单位毫秒),如
果无法满足此时间,JVM
会自动调整年轻代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小
和相应的 Survivor
区比例,以达到目标系统规定的最低响应时间或者收集频率等。
此参数建议使用并行收集器时,一直打开。
并发收集器(响应时间优先)
-XX:+UseParNewGC:设置年轻代为并发收集。可与 CMS 收集同时使用。JDK5.0 以
上,JVM
会根据系统配置自行设置,所以无需再设置此值。
CMS,全称 Concurrent Low Pause Collector,是 jdk1.4 后期版本开始引入的新 gc
算法,在 jdk5 和 jdk6 中得到了进一步改进,它的主要适合场景是对响应时间的重要性
需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应
用中存在比较多的长生命周期的对象的应用。CMS 是用于对 tenured generation 的回