java应用程序可使用的最大堆内存可使用-Xmx 参数指定,最大堆内存是新生代和年老年代之和的最大值。java
下面代码演示在java虚拟机被设定了最大堆内存以后,建立不能被回收的java对象,会发生“java.lang.OutOfMemoryError: Java heap space”异常。数组
设定参数:-Xmx5M服务器
public static void main(String[] args) { Vector v = new Vector(); for (int i=1;i<=10;i++){ byte[] b = new byte[1024*1024];//给次循环占用1M空间 v.add(b);//强引用,不会被GC回收 System.out.println(i+"M is allocated"); } System.out.println("Max memory :"+Runtime.getRuntime().maxMemory()/1024/1024+"M");//系统可用最大内存 }
运行结果spa
1M is allocated
2M is allocated
3M is allocated
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space操作系统
由于堆内存最大值为5M,在被占用了3M以后,剩余的空闲内存已经不够1M了,因此会发生内存溢出错误。线程
设定参数:-Xmx15M 运行结果说明最大堆内存为15M时,知足建立10个1M大小的数组。对象
1M is allocated
2M is allocated
3M is allocated
4M is allocated
5M is allocated
6M is allocated
7M is allocated
8M is allocated
9M is allocated
10M is allocated
Max memory :15M内存
使用JVM参数-Xms能够设置系统最小堆空间。java应用程序在运行时,首先会被分配-Xms指定的内存大小,并尽量尝试在这个空间段内运行,当-Xms指定的内存实在没法知足程序运行时,JVM才会向操做系统申请更多的内存,直到内存大小达到-Xmx指定的值。若超过-Xmx的值则抛出OutOfMemoryError。get
当参数-Xms设置太小时,JVM为了保证系统尽量在该空间范围内运行,就会更加频繁地进行GC操做,这样就会对系统产生必定的影响。虚拟机
代码演示-Xms堆内存设置对GC频次的影响
public static void main(String[] args){ Vector v = new Vector(); for (int i=1;i<=10;i++){ byte[] b = new byte[1024*1024];//给次循环占用1M空间 v.add(b);//强引用,不会被GC回收 if(v.size() == 3){ System.out.println("累计3M时清空内存"); v.clear();//清除引用,GC能够对没有引用的对象回收 } } }
参数:-Xmx11m -Xms4m -verbose:gc,系统进行4次GC,1次Full GC,如下运行结果
[GC (Allocation Failure) 505K->504K(3584K), 0.0011018 secs]
[GC (Allocation Failure) 1016K->648K(3584K), 0.0125823 secs]
累计3M时清空内存
累计3M时清空内存
[GC (Allocation Failure) 7925K->7872K(9216K), 0.0039725 secs]
[GC (Allocation Failure) 7872K->7872K(9728K), 0.0010522 secs]
[Full GC (Allocation Failure) 7872K->1649K(4608K), 0.0225880 secs]
累计3M时清空内存
参数:-Xmx11m -Xms11m -verbose:gc,系统进行5次GC,0次Full GC,如下运行结果
[GC (Allocation Failure) 2272K->1672K(11776K), 0.0013209 secs]
累计3M时清空内存
[GC (Allocation Failure) 3809K->1704K(11776K), 0.0009657 secs]
[GC (Allocation Failure) 3820K->3784K(11776K), 0.0012901 secs]
累计3M时清空内存
[GC (Allocation Failure) 5897K->4808K(11776K), 0.0010995 secs]
累计3M时清空内存
[GC (Allocation Failure) 6919K->4808K(11776K), 0.0007631 secs]
注意:JVM会试图将系统尽量限制在-Xms中,所以当实际占用内存接近-Xms时就会触发Full GC。
参数-Xmn用于设置新生代空间大小,当新生代设置较大时老年代空间就会相应的减少,因此这个参数的设置对系统新能和GC行为有很大影响,新生代的大小通常为整个堆内存的1/4到1/3左右。
在Hot Spot虚拟机中,-XX:NewSize用于设置新生代初始大小,-XX:MaxNewSize用于设置新生代最大值。一般状况下-Xmn已经能够知足咱们绝大多说须要,设置-Xmn效果就等于设置了相同的-XX:NewSize和-XX:MaxNewSize,若设置不一样的-XX:MaxNewSize和-XX:NewSize反而会致使内存震荡。
在JDK6版本中:
--XX:PermSize:设置持久带初始大小
XX:MaxPermSize:设置持久带最大值
JDK8版本中:
默认状况下元空间大小受本地内存大小影响,也能够经过参数指定元空间大小。
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:若是释放了大量的空间,就适当下降该值;若是释放了不多的空间,那么在不超过MaxMetaspaceSize时,适当提升该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
线程栈是线程执行时开辟的一块独立内存空间。
例如配置:-Xss1M,表示设置每一个线程拥有1M的栈空间,在本机计算机上能够开1803个线程,当修改-Xss20M时在本机计算机上只能开81个线程了。
若是指定了最大堆内存,则会发现系统所能支持的线程数与堆内存还有关系,服务器本地内存必定的状况下,堆内存占用越大,相应的线程栈所能占用的内存就会变小。
生产上面更多的是但愿对堆空间进行比例分配。
-XX:SurvivorRatio是用来设置新生代中eden区和s0空间的比例关系。s0和s1空间大小是相同的,并在MinorGC后,会互换角色。
-XX:SurvivorRatio = eden/s0=eden/s1
如-Xmn10M -XX:SurvivorRatio=8,则表示eden =8M,s0=1M,s1=1M.
如-Xmn10M -XX:SurvivorRatio=2,则表示eden=5M,s0=2.5M,s1=2.5M
-XX:NewRatio用来设置新生代和老年代比例
-XX:NewRatio=老年代/新生代
如-Xms20M -Xmx20M -XXNewRatio=2,则表示 新生代=6.6M 老年代=13.3M。
-Xms:设置初始堆大小。
-Xmx:设置最大堆大小。
-Xss:设置线程栈大小。
-XX:NewSize:设置新生代大小。
-XX:SurvivorRatio:设置eden/s0比例。
-XX:TargetSurvivorRatio:设置survivor区可以使用率,当survivor区的空间使用率达到这个值时会将对象送入老年代。
-XX:NewRatio:设置老年代/新生代比例。
-XX:MetaspaceSize:设置初始元空间大小。
-XX:MaxMetaspaceSize:设置最大元空间大小。