2. JVM基础-虚拟机基本配置参数

在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的鼓掌排查会有一定的帮助。因此,虚拟机提供了一些跟踪系统状态的参数,使用给定的参数执行java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。虚拟机参数配置,其实主要围绕着堆、栈、方法区进行配置。

 

2.1 堆分配参数

  • -XX:+PrintGC    使用这个参数,虚拟机启动后,只要遇到GC就会打印日志。
  • -XX:+UseSerialGC    配置串行回收器
  • -XX:+PrintGCDetails    可以查看详细信息,包括各个区的情况
  • -Xms    设置java程序启动时初始堆大小
  • -Xmx    设置java程序能获得的最大堆大小
  • -XX:+PrintCommandLineFlags    可以将隐式或者显式传给虚拟机的参数输出
//查看GC信息
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
		
byte[] b1 = new byte[1*1024*1024];
System.out.println("分配了1M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
		
byte[] b2 = new byte[4*1024*1024];
System.out.println("分配了4M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());

运行参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

在实际工作中,可以直接讲初始化的堆大小与最大堆大小设置相等,这样的好处是可以减少运行时的垃圾回收次数,从而提高性能。

 

新生代的配置

-Xmn:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数堆系统的性能以及GC行为有较大的影响,新生代大小一般会设置整个堆空间的的1/3到1/4左右。

-XX:SurvivorRatio     用来设置新生代中eden空间和from/to空间的比例。(-XX:SurvivorRatio=eden/from=eden/to)

-XX:NewRatio    用来设置老年代和新生代的比例。(-XX:NewRatio=老年代/新生代)

byte[] b = null;
//连续向系统申请10MB空间
for(int i = 0 ; i <10; i ++){
	b = new byte[1*1024*1024];
}

 根据不同的参数运行:

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

 

2.2 对溢出处理

在java程序运行过程中,如果堆空间不足,则会抛出内存溢出错误(Out of Menory),一旦这类问题发生在生产环境,可能引起严重的业务中断,java虚拟机提供了 -XX:+HeapDumpOnOutOfMemoryError,使用该参数可以在内存溢出时导出整个堆信息,与之配合使用的参数有 -XX:HeapDumpPath ,可以设置导出堆的存放路径。

Vector v = new Vector();
for(int i=0; i < 5; i ++){
	v.add(new Byte[1*1024*1024]);
}

-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump

D盘生成 Test03.dump 文件,可能用 Memory Analyzer 工具分析。

 

2.3 栈配置

java虚拟机提供了参数-Xss来指定线程最大的栈空间大小,整个参数也直接指定了函数可调用的最大深度。

//栈调用深度
rivate static int count;
	
public static void recursion(){
	count++;
	recursion();
}
public static void main(String[] args){
	try {
		recursion();
	} catch (Throwable t) {
		System.out.println("调用最大深入:" + count);
		t.printStackTrace();
	}
}

-Xss1m

-Xss5m

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值