Java性能优化全攻略

  垃圾回收

  Java垃圾回收流程对于程序性能是至关重要的。为了提供有效的垃圾回收,Heap(堆)本质上是划分在子区域中。

  堆区域

区域描述最新一代-Young Generation (nursery space)

新的或短暂的对象分配保留堆的一部分。垃圾被一个fast but stop-the-world YG的收集器进行回收。

在young space中呆了足够久的对象就会提升到old space。

注意:YG space的尺寸和GC频率过高将会显著影响程序的响应时间,从而导致JVM的暂停时间增加。

老一代-Old Generation  (tenured space)

heap的一部分留给了long-lived对象。垃圾通常通过平行或并发(多数时候)进行收集,诸如CMS或gencon (IBM JVM)。

性能提示:根据应用程序的需求选择并测试最佳的GC策略是非常重要的。例如,当切换到并发GC收集(如CMS或G1)可以显著提高应用程序的平均响应时间(减少延迟)。

物联网

  GC Collectors

  选择正确的collector或GC policy可以将程序的性能、可扩展性和可靠性优化到最佳状态。许多应用程序对于响应时间延迟都很敏感,因此大多需要使用并发的回收器,例如HotSpot CMS或IBM GC policy balanced。

  我们强烈建议您通过适当的性能和负载测试确定最合适的GC策略。应该在生产环境中执行全面监控策略,以跟踪整体的JVM性能,并确定在之后需要改进的领域。

GC论据描述串行回收器-XX:+UseSerialGC (Oracle HotSpot)无论新旧回收器都使用单独CPU,像是一种stop the world的时尚。#FormatImgID_5#并行回收器(吞吐量回收器)-XX:+UseParallelGC-XX:+UseParallelOldGC 
(Oracle Hotspot)

-Xgcpolicy:optthruput

(IBmJ9, single space, stop-the-world)

旨在利用CPU的内核优势。无论新旧回收器都使用多个Gcthreads(via –XX:ParallelGCThreads=n),从而更好地利用来自主机的可用的CPU内核来完成。注意:虽然回收时间可以显著减少,但是有着大尺寸堆的程序面临着large、stop-the-world、old回收,并且响应时间也受到影响。#FormatImgID_6#确保适当的Permanent Generation / Metaspace和本地内存大小。密切监视你的PermGen、元空间和本机内存利用率,并调整到适合的最大容量。分析程序类加载器的大小,并寻找机会适当地减少元数据足迹。

注意:YoungGen collections仍然有stop-the-world事件,因此需要适当的微调,以减少总JVM暂停时间。

#FormatImgID_7#

  Garbage First (G1) Collector

  HotSpot G1 collector是专为是专为满足用户定义的垃圾回收(GC)高概率暂停时间设计的,同时实现高吞吐量。

  最新的HotSpot collector将heap基本划分到一组大小相等的堆区域,虚拟内存的每个区域连续范围。它将回收压缩的活动集中在heap区域,那里充满了可回收的对象(garbage first)。换句话说就是,这个区域有最低限度的“live”对象。

  Oracle建议在以下例子和情况下使用G1 collector,尤其是对于目前正在使用CMS或parallel collectors的:

  专为large heaps(>= 6 GB),并限制GC延迟(暂停时间<= 0.5秒)的应用程序设计。

  超过50%的Java heap被实时数据占用(对象不能被GC回收)。

  对象分析率和促进作用显著变化。

  不期望过长的垃圾回收或压缩停顿(超过0.5至1秒)。

物联网

  Java Heap尺寸

  你一定要知道没有GC策略可以挽救Java Heap尺寸不足的现象。这些演习涉及到为不同的存储空间(包括新旧不同的版本)配置最大和最小的容量,包括元数据和本地内存容量。这里有一些建议准则: