-verbose:gc 能夠打印GC的簡要信息java
-XX:+PrintGC 能夠打印GC的簡要信息
使用方式 Java -參數(-verbose:gc) GCTest(這個是要執行的Java程序 也能夠是 .jar) node
-XX:+PrintGCDetails 看名字就是打印Gc詳細信息bash
-XX:+PrintGCTimeStamps 打印CG發生的時間戳jvm
分配 4m的時候 maven
執行gc的時候到這的時候是時候提出問題了編輯器
-Xmx 和 –Xms 應該保持一個什麼關係,可讓系統的性能儘量的好呢?
若是你要作一個Java的桌面產品,須要綁定JRE,可是JRE又很大,你如何作一下JRE的瘦身呢?
複製代碼
-Xmn:設置新生代大小ide
-XX:NewRatio:函數
新生代(eden+2*s)和老年代(不包含永久區)的比值,
4 表示 新生代:老年代=1:4,即年輕代佔堆的1/5
複製代碼
-XX:SurvivorRatio:性能
設置兩個Survivor區和eden的比
8表示 兩個Survivor :eden=2:8,即一個Survivor佔年輕代的1/10
複製代碼
使用 測試
-XX:+HeapDumpOnOutOfMemoryError :OOM時導出堆到文件
-XX:+HeapDumpPath:導出OOM的路徑
看個例子
其中隱藏掉的是:-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump若是你的編輯器是idea想看一下的話 按照那個圖片設置完成後 運行項目就ok了
-XX:OnOutOfMemoryError
在OOM時,執行一個腳本
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p「(這個printstack.bat裏邊的內容是 D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt )
當程序OOM時,在D:/a.txt中將會生成線程的dump
能夠在OOM時,發送郵件,甚至是重啓程序
複製代碼
是時候總結一波了
根據實際事情調整新生代和倖存代的大小
官方推薦新生代佔堆的3/8
倖存代佔新生代的1/10
在OOM時,記得Dump出堆,確保能夠排查現場問題
複製代碼
-XX:PermSize -XX:MaxPermSize
設置永久區的初始空間和最大空間
他們表示,一個系統能夠容納多少個類型
這裏我就截圖把結果顯示出來了
你本身試得時候 CglibBean 沒有,別擔憂在這裏
public class GcTset {
public static void main(String[] args) {
// byte [] b = new byte[1*1024*1024];
// System.out.print("Xmx = ");
// System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024 +"M");
// System.out.print("free mem=");
// System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024 +"M");
//
// System.out.print("total mem=");
// System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024 +"M");
// Vector v = new Vector();
// for (int i = 0; i < 25; i++) {
// v.add(new byte[1*1024*1024]);
// }
for (int i = 0; i < 1000000; i++) {
CglibBean bean = new CglibBean("geym.jvm.ch3.perm.bean" + i, new HashMap());
}
}
}
class CglibBean {
/**
* 實體Object
*/
public Object object = null;
/**
* 屬性map
*/
public BeanMap beanMap = null;
public CglibBean() {
super();
}
@SuppressWarnings("unchecked")
public CglibBean(String name, Map propertyMap) {
this.object = generateBean(name,propertyMap);
this.beanMap = BeanMap.create(this.object);
}
/**
* 給bean屬性賦值
*
* @param property
* 屬性名
* @param value
* 值
*/
public void setValue(String property, Object value) {
beanMap.put(property, value);
}
/**
* 經過屬性名獲得屬性值
*
* @param property
* 屬性名
* @return 值
*/
public Object getValue(String property) {
return beanMap.get(property);
}
/**
* 獲得該實體bean對象
*
* @return
*/
public Object getObject() {
return this.object;
}
@SuppressWarnings("unchecked")
private Object generateBean(String name, Map propertyMap) {
BeanGenerator generator = new BeanGenerator();
Set keySet = propertyMap.keySet();
for (Iterator i = keySet.iterator(); i.hasNext();) {
String key = name +(String) i.next();
generator.addProperty(key, (Class) propertyMap.get(key));
}
return generator.create();
}
}
複製代碼
maven的
<dependency>
<groupId>cglib-nodep-2.2.jar</groupId>
<artifactId>cglib-nodep-2.2.jar</artifactId>
</dependency>
複製代碼
-Xss
一般只有幾百K
決定了函數調用的深度
每一個線程都有獨立的棧空間
局部變量、參數 分配在棧上
複製代碼
設置棧大小 仍是先把結果顯示出來
代碼
private static int count=0;
public static void recursion(long a,long b,long c){
long e=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=10;
count++;
recursion(a,b,c);
}
public static void main(String args[]){
try{
recursion(0L,0L,0L);
}catch(Throwable e){
System.out.println("deep of calling = "+count);
e.printStackTrace();
}
}
複製代碼
若是你是idea執行的話不要忘記把這個參數帶上
若是是命令行的話 java -Xss128k GcTest
我以爲 最後補充一下 這個圖片中三單詞的意思
在GC收集的時候,
頻繁收集生命週期短的區域(Young area),由於這個區域內的對象生命週期比較短,GC
效率也會比較高。
而比較少的收集生命週期比較長的區域(Old area or Tenured area),
以及基本不收集的永久區(Perm area)。
複製代碼
由於個人能力有限就到這把,具體在項目中使用呢,我也沒用過爲啥呢由於我作的項目尚未到用這個的時候。固然我很但願能在項目中真正使用一下,這些只是本身寫測試一下,還有好可能是查資料看的。