jvm诊断与优化(3)

jvm内存:如图从左到右依次为:

[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法区\持久区)Perm 

jvm诊断与优化(3)_第1张图片

-Xms120M    设置堆的初始大小120M

-Xmx120M    设置堆最大的空间120M;实际最大的可用空间会比设定值小些;丢失的大小等于from/to空间;

                         也就是说 最大可用空间 = Xmx值 - from/to值,少去的那部分是新生代的空间。

参数说明:  jvm空间会尽量保持在初始大小(-Xms),除非有必要扩展堆空间,但最大不超过设定的最大小值(-Xms) 。

最好让初始值与最大值一致。减少GC触发的次数,提高性能

-Xmn40M  设置新生代的大小40M(Eden+S0+S1).设置一个较大的新生代会减小老年代的大小。一般配置

                      新生代的大小为整个堆空间的1/3 到 1/4

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

例 java -Xmx12M -Xms12M -Xmn4M -XX:SurvivorRatio=2 -XX:+PrintGCDetails  jvm.Test 0

PSYoungGen 
  total 3072K, used 716K [0x00000000ffc00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 34% used [0x00000000ffc00000,0x00000000ffcb32e0,0x00000000ffe00000)
  from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
  to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
ParOldGen  
  total 8192K, used 0K [0x00000000ff400000, 0x00000000ffc00000, 0x00000000ffc00000)
  object space 8192K, 0% used [0x00000000ff400000,0x00000000ff400000,0x00000000ffc00000)
PSPermGen 
  total 21504K, used 2549K [0x00000000fa200000, 0x00000000fb700000, 0x00000000ff400000)
  object space 21504K, 11% used [0x00000000fa200000,0x00000000fa47d570,0x00000000fb700000)

输出说明: 新生代的最大可用空间 = Xmn值 - from/to值 = 4M - 1024K = 3072K              

               新生代最大空间 = eden+s0(from)+s1(to) = 2048K+ 1024K +1024K = 4M    

              老年代的最大可用空间 = Xmx值 - Xmn值 = 12M - 4M = 8192K

              堆最大可用空间 Xmx值 - from/to值 = 12M - 1024K = 11M

-XX:NewRatio = 老年代/新生代     //配置老年代与新生代的比例

参数说明:新生代与老年代空间大小的分配对GC行为有很大的影响,尽可能将对象预留在新生代,减少老年代GC次数

---------------------------------------------------------------------------------------

jvm 的非堆内存有 持久区栈空间 和 直接空间 (jvm也可以直接用系统空间)

-XX:PermSize50M  和 -XX:MaxPerSize50M  配置持久区的初始空间与最大空间50MB(jdk6 jdk7)

提示:jdk8中持久区已经算到系统空间中了,即系统内存有多少它就能用多少不受限。但依然可用-XX:MaxMetaspaceSize指定最大使用空间

-Xss10M  指定线程最大栈空间为10MB(说明见1章)

-XX:MaxDirectMemorySize   最大可使用的直接内存空间,默认为Xmx值

参数说明:当前直接内存达到最大值时GC就会回收。如不能回收还是会发生内存溢出,直接内存的读写速度会比堆内存快40%,

但申请内存空间这方面对堆内存操作的速度远远高于直接内存。所以直接内存适合申请次数少访问频繁的场合。

-----------------------------------------------------------------------------------------

当程序运行空间超过jvm的内存就是抛出OutOfMemoryError异常,即OOM

package jvm;
import java.util.ArrayList;
import java.util.List;

public class Test2 {
	
	public static void main(String[] args) {
		List<Object> container = new ArrayList<Object>();
		int length = Integer.parseInt(args[0]);
		for (int i = 0; i < length; i++) {
			container.add(new byte[1*1024*1024]);
		}
	}
}

 -XX:+HeapDumpOnOutOfMemoryError  在内存溢出时导出整个堆的信息

 -XX:HeapDumpPath  指定导出堆的存放路径,配合HeapDumpOnOutOfMemoryError 使用

例 java -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/a.dump jvm.Test2 30

java.lang.OutOfMemoryError: Java heap space
Dumping heap to E:/a.dump ...
Heap dump file created [18974861 bytes in 0.061 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at jvm.Test2.main(Test2.java:11)
a.dump 这个文件可以使用MAT工具打开

-XX:OnOutOfMemoryError  在发生溢出错误时执行一个脚本文件,用于自救,通知等

例: java -Xmx20M "-XX::OnOutOfMemoryError=E:/printstack.bat %p" -XX:+HeapDumpOnOutOfMemoryError  jvm.Test2 30

----------------------------------------------------------------------------------------------

最后虚拟机的工作模式 Client 和 Server

-client   指定client 工作模式

-server 指定server 工作模式;启动慢但执行速度远快于client模式。一般都是server模式工作的

java -version 查看当前模式

java -version
java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode) //当前为server模式

参数说明:默认情况下jvm会自动根据系统选择。


你可能感兴趣的:(jvm诊断与优化(3))