jvm内存:如图从左到右依次为:
[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法区\持久区)Perm
-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会自动根据系统选择。