jvm虛擬機

深入理解java虛擬機  第二版


代碼清單2-3  

-verbose:gc -Xms20M -Xmx20M -XX:+PrintGCDetails

[GC (Allocation Failure) [PSYoungGen: 5267K->504K(6144K)] 5267K->3689K(19968K), 0.0093301 secs] [Times: user=0.03 sys=0.02, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 6045K->504K(6144K)] 9230K->8240K(19968K), 0.0089480 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6136K->0K(6144K)] [ParOldGen: 10901K->12845K(13824K)] 17037K->12845K(19968K), [Metaspace: 2599K->2599K(1056768K)], 0.2414392 secs] [Times: user=0.41 sys=0.00, real=0.24 secs] 
[Full GC (Ergonomics) [PSYoungGen: 3564K->3001K(6144K)] [ParOldGen: 12845K->13356K(13824K)] 16409K->16358K(19968K), [Metaspace: 2599K->2599K(1056768K)], 0.1785501 secs] [Times: user=0.61 sys=0.00, real=0.18 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 3001K->3001K(6144K)] [ParOldGen: 13356K->13345K(13824K)] 16358K->16346K(19968K), [Metaspace: 2599K->2599K(1056768K)], 0.1397200 secs] [Times: user=0.41 sys=0.00, real=0.14 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.ArrayList.grow(Unknown Source)
	at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
	at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
	at java.util.ArrayList.add(Unknown Source)
	at jvm.HeapOOM.main(HeapOOM.java:19)
Heap
 PSYoungGen      total 6144K, used 3224K [0x00000000ff980000, 0x0000000100000000, 0x0000000100000000)
  eden space 5632K, 57% used [0x00000000ff980000,0x00000000ffca62f8,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 13824K, used 13345K [0x00000000fec00000, 0x00000000ff980000, 0x00000000ff980000)
  object space 13824K, 96% used [0x00000000fec00000,0x00000000ff908450,0x00000000ff980000)
 Metaspace       used 2630K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 291K, capacity 386K, committed 512K, reserved 1048576K



代碼清單2-4  棧溢出

-Xss128K 

代碼清單2-8  cglib

/**
 * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
 * @author zzm
 */
public class JavaMethodAreaOOM {

	public static void main(String[] args) {
		while (true) {
			Enhancer enhancer = new Enhancer();
			enhancer.setSuperclass(OOMObject.class);
			enhancer.setUseCache(false);
			enhancer.setCallback(new MethodInterceptor() {
				public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
					return proxy.invokeSuper(obj, args);
				}
			});
			enhancer.create();
		}
	}

	static class OOMObject {

	}
}


3.2.3節 

引用

import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

軟引用

SoftReference<T>

弱引用

WeakReference<T>

虛引用 

PhantomReference<T>


3.5.9 垃圾收集器參數總結

1.與串行回收器相關的參數
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:設置eden區大小和survivor區大小的比例
-XX:PretenureSizeThreshold:設置大對象直接進入老年代的閾值。當對象的大小超過這個值時,將直接在老年代分配。
-XX:MaxTenuringThreshold:設置對象進入老年代的年齡的最大值。每一次Minor GC後,對象年齡就加1。任何大於這個年齡的對象,一定會進入老年代。
2.與並行GC相關的參數
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:ParallelGCThreads:設置用於垃圾回收的線程數。通常情況下可以和CPU數量相等,但在CPU數量較多的情況下,設置相對較小的數值也是合理的。
-XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間。他的值是一個大於0的整數。收集器在工作時,會調整Java堆大小或者其他參數,儘可能把停頓時間控制在MaxGCPauseMillis以內。
-XX:GCTimeRatio:設置吞吐量大小。它是0-100的整數。假設GCTimeRatio的值爲n,那麼系統將花費不超過1/(1+n)的時間用於垃圾收集。
-XX:+UseAdaptiveSizePolicy:打開自適應GC策略。在這種模式下,新生代的大小、eden和survivor的比例、晉升老年代的對象年齡等參數會被自動調整,已達到在堆大小、吞吐量和停頓時間之間的平衡點。
3.與CMS回收期相關的參數
-XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發,默認爲68%
-XX:+UseCMSCompactAtFullCollection:設置CMS收集器完成垃圾收集後是否要進行一次內存碎片的整理
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮
-XX:+CMSClassUnloadingEnabled:允許對類元數據區進行回收
-XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到這一百分比時,啓動CMS回收(前提是-XX:+CMSClassUnloadingEnabled激活了)
-XX:UseCMSInitiatingOccupancyOnlyn:表示只在到達閾值的時候才進行CMS回收
-XX:+CMSIncrementalMode:使用增量模式,比較適合單CPU。增量模式在JDK 8中標記爲廢棄,並將在JDK 9中徹底移除。
4.與G1回收期相關的參數
-XX:+UseG1GC:使用G1回收器
-XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間
-XX:GCPauseIntervalMillis:設置停頓間隔時間
5.TLAB相關
-XX:+UseTLAB:開啓TLAB分配
-XX:+PrintTLAB:打印TLAB相關分配信息
-XX:TLABSize:設置TLAB大小
-XX:+ResizeTLAB:自動調整TLAB大小
6.其他參數
-XX:+DisableExplicitGC:禁用顯式GC
-XX:+ExplicitGCInvokesConcurrent:使用併發方式處理顯式GC


-XX:+HeapDumpOnOutOfMemoryError

JDK邏輯集羣

分析缺陷:

硬件雙核16G

5個32位jdk邏輯集羣,進程算2GB(堆固定1.5GB),佔用10G內存,文檔服務器(cms收集器),JbossCacahe全局緩存

HashMap<long,long>的空間效率分析









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章