JMM分隔图面试JVM详情

 

 

-Xms20M  starting
-Xmx     max
-Xmn     new

对象分配eden
-XX:SurvivorRatio=8
8:1:1

TLAB  Thread Local Allaction Buffer

对象很大
	-XX:PretenureSizeThreshold=3145728   3M
长期存活的对象 
	-XX:MaxTenuringThreshold=15
动态对象年龄判定
	相同年龄所有对象的大小总和 > Survivor空间的一半
	
分配担保
	Minor GC 之前检查 老年代最大可用连续空间是否>新生代所有对象总空间
	
	
Minor GC  
Major GC
Full  GC
	
什么样的对象需要回收?
判断算法
引用
	强  Object object = new Object();
	软  
	弱  
	虚  
	
回收
	方法论
		标记-清除算法
		复制回收算法
		标记-整理算法
	垃圾收集器
		STW  Stop The World
		Serial
		ParNew 
			-XX:ParallelGCThreads
		Parallel Scavenge (全局)
			吞吐量 = 运行用户代码时间 / (运行用户代码时间  + 垃圾收集时间)
			-XX:MaxGCPauseMillis=n
			-XX:GCTimeRatio=n
			-XX:UseAdaptiveSizePolicy   GC  Ergonomics
		Serial Old
			CMS备用预案  Concurrent Mode Failusre时使用
			标记-整理算法
		Parallel Old
			标记-整理算法
		CMS
			标记-清除算法
			减少回收停顿时间
			碎片 -XX:CMSInitiatingOccupancyFraction  
			Concurrent Mode Failure 启用Serial Old
			
			-XX:+UseCMSCompactAtFullCollection
			-XX:CMSFullGCsBeforeCompaction 执行多少次不压缩FullGC后 来一次带压缩的 0 表示每次都压
			-XX:+UseConcMarkSweep
		G1
			
回收的时间节点
	
如何查看当前的垃圾回收器
	-XX:+PrintFlagsFinal
	-XX:+PrintCommandLineFlags
	server client
	MBean
	
GC日志
	1.输出日志
	-XX:+PrintGCTimeStamps 
	-XX:+PrintGCDetails 
	-Xloggc:/home/administrator/james/gc.log
	-XX:+PrintHeapAtGC
	2.日志文件控制
	-XX:-UseGCLogFileRotation
	-XX:GCLogFileSize=8K
	3.怎么看
	
JDK自带的 监控工具
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/toc.html
	jmap -heap pid 堆使用情况
	jstat  -gcutil pid 1000
	jstack  线程dump 
	jvisualvm
	jconsole
	
MAT
	http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
	-XX:+HeapDumpOnOutOfMemoryError 
	-XX:HeapDumpPath=/home/administrator/james/error.hprof

怀疑:
	1.看GC日志  126719K->126719K(126720K)
	2.dump
	3.MAT
		1.占用Retained Heap
		2.看有没有GC Root指向
	
	
VM参数
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
	
	
	
	
	
	
	
	
	
	
	
	
	
	

什么条件触发STW的Full GC呢?
Perm空间不足;
CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
(promontion faild产生的原因是EDEN空间不足的情况下将EDEN与From survivor中的存活对象存入To survivor区时,To survivor区的空间不足,再次晋升到old gen区,而old gen区内存也不够的情况下产生了promontion faild从而导致full gc	)

统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;

主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。
	
	
java -Xms8m -Xmx64m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &

java -Xms128m -Xmx128m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/administrator/james/error.hprof -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC  -XX:+UseCMSCompactAtFullCollection -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &
 	
java -Xms128m -Xmx128m -verbose:gc -Xloggc:/home/administrator/james/gc.log  -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintHeapAtGC -XX:HeapDumpPath=/home/administrator/james/error.hprof -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGCDetails -XX:+UseCMSCompactAtFullCollection -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9004 -Djava.rmi.server.hostname=177.1.1.122 -jar jvm-demo1-0.0.1-SNAPSHOT.jar  > catalina.out  2>&1 &
 	

-XX:+CMSScavengeBeforeRemark
	
	
	
	
	
	
发布了307 篇原创文章 · 获赞 15 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u011488009/article/details/104433607