Java虚拟机详解----常用JVM配置参数

原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html

【声明】

欢迎转载,但请保留文章原始出处

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4736162.html

联系方式:smyhvae@163.com

本文主要内容:

  • Trace跟踪参数
  • 堆的分配参数
  • 栈的分配参数

在IDE的后台打印GC日志:

既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。

既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。

(1)如果你用的是Eclipse,打印GC日志的操作如下:
这里写图片描述

这里写图片描述

在上图的箭头处加上-XX:+PrintGCDetails这句话。于是,运行程序后,GC日志就可以打印出来了:

这里写图片描述

当然了,光有-XX:+PrintGCDetails这一句参数肯定是不够的,下面我们详细介绍一下更多的参数配置。

一、Trace跟踪参数:

1、打印GC的简要信息:

-verbose:gc
-XX:+printGC

解释:可以打印GC的简要信息。比如:

[GC 4790K->374K(15872K), 0.0001606 secs]

[GC 4790K->374K(15872K), 0.0001474 secs]

[GC 4790K->374K(15872K), 0.0001563 secs]

[GC 4790K->374K(15872K), 0.0001682 secs]

上方日志的意思是说,GC之前,用了4M左右的内存,GC之后,用了374K内存,一共回收了将近4M。内存大小一共是16M左右。

2、打印GC的详细信息:

-XX:+PrintGCDetails

解释:打印GC详细信息。

-XX:+PrintGCTimeStamps

解释:打印CG发生的时间戳。

理解GC日志的含义:

例如下面这段日志:

[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。

再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。

再比如下面这段GC日志:

这里写图片描述

上图中,我们先看一下用红框标注的“[0x00000000d5900000, 0x00000000d8380000, 0x0000000100000000)”的含义,它表示新生代在内存当中的位置:第一个参数是申请到的起始位置,第二个参数是申请到的终点位置,第三个参数表示最多能申请到的位置。上图中的例子表示新生代申请到了大约42.5M的控件,而这个42.5M是等于:(eden space的33280K)+(from space的5120K)+(to space的5120K)。

疑问:分配到的新生代有15M,但是可用的只有38400K,为什么会有这个差异呢?等我们在后面的文章中学习到了GC算法之后就明白了。

3、指定GC log的位置:

-Xloggc:log/gc.log

解释:指定GC log的位置,以文件输出。帮助开发人员分析问题。

这里写图片描述

这里写图片描述

-XX:+PrintHeapAtGC

解释:每一次GC前和GC后,都打印堆信息。

例如:

上图中,红框部分正好是一次GC,红框部分的前面是GC之前的日志,红框部分的后面是GC之后的日志。

二、堆的分配参数:

1、-Xmx –Xms:指定最大堆和最小堆

举例、当参数设置为如下时:

-Xmx20m -Xms5m

然后我们在程序中运行如下代码:

这里写图片描述

输出结果:

这里写图片描述

保持参数不变,在程序中运行如下代码:(分配1M空间给数组)

这里写图片描述

输出结果:

这里写图片描述

注:Java会尽可能将total mem的值维持在最小堆。

保持参数不变,在程序中运行如下代码:(分配10M空间给数组)

这里写图片描述

输出结果:

这里写图片描述

如上图所示:此时,total mem 为5.5M时已经不能满足需求了,于是total mem涨成了15.0M。

保持参数不变,在程序中运行如下代码:(进行一次GC的回收)

System.gc();

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory()/1024.0/1024 + "M"); //系统的最大空间
System.out.println("free mem=" + Runtime.getRuntime().freeMemory()/1024.0/1024 + "M"); //系统的空闲空间
System.out.println("total mem=" + Runtime.getRuntime().totalMemory()/1024.0/1024 + "M"); //系统当前的可用空间

输出结果:

这里写图片描述

(未完待续。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值