-verbose:gc 能够打印GC的简要信息java
-XX:+PrintGC 能够打印GC的简要信息
使用方式 Java -参数(-verbose:gc) GCTest(这个是要执行的Java程序 也能够是 .jar) node
-XX:+PrintGCDetails 看名字就是打印Gc详细信息bash
-XX:+PrintGCTimeStamps 打印CG发生的时间戳jvm
分配 4m的时候 maven
到这的时候是时候提出问题了编辑器
-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的路径
看个例子
若是你的编辑器是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)。
复制代码
由于个人能力有限就到这把,具体在项目中使用呢,我也没用过为啥呢由于我作的项目尚未到用这个的时候。固然我很但愿能在项目中真正使用一下,这些只是本身写测试一下,还有好可能是查资料看的。