您的位置 首页 java

Java Jvm 的分配参数概述

在前几篇中有基本概述如下

Java Jvm 的分配参数概述

1 java 应用程序设置最大堆内存与最小堆内存

1.1 最大堆内存

java应用程序可以使用最大堆内存可以用-Xmx参数指定,最大堆内存指的是新生代和老年代的大小之和的最大值,是java应用程序的堆上限
在java程序运行时可以通过 Runtime.getRuntime().maxMemory()取得系统的可用的最大堆内存

1.2 最小堆空间

使用 -Xms可用于设置系统的最小堆空间,也就是jvm启动时所占据的操作系统的内存大小,java应用程序在运行时,首先会被分配-Xms指定的内存大小,并尽可能的在这个空间段内存中运行程序,当这个值无法满足应用程序时,jvm才会向操作系统中申请更多的内存,直到内存值达到-Xmx指定的大小,若超过-Xmx指定的大小时,则抛出 OutOfMemoryError异常

如果 -Xms的数值较小,那么JVM为了保证系统尽可能的在指定内存范围中运行,就会更加频繁地进行GC操作,以释放内存空间
因此 把-Xms的值设置为-Xmx时,可以在系统运行初期时减少CG的次数和耗时


2 java 应用程序设置新生代内存与持久代内存

2.1 新生代内存

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

在Hot Spot虚拟机中,-XX:NewSize用于设置新生代的初始大小,-XX:MaxNewSize设置新生代的最大值,通常情况下,设置-Xmn的效果等同于设置了想用 的-XX:NewSize 和-XX:MaxNewSize,若设置不用的XX:NewSize 和-XX:MaxNewSize,可能会导致内存震荡,从而产生不必要的系统开销

2.1 持久代内存(方法区)

参数 -XX:MaxPermSize可以设置持久代的最大值,-XX:PermSize可以设置持久代的初始大小
系统所支持的最大类数量,与MaxPermSize成正比,一般设置为64M可以满足绝大部分程序的正常工作,如果不够可以设置为 128M,这是两个比较常用的永久区取值


3 java 应用程序设置线程栈内存

参数 -Xss 参数用来设置线程栈(针对每一个线程)的大小
在线程进行局部变量分配,函数调用时,都需要在栈中开辟空间,如果栈的空间开辟太小,那么线程在运行时,就可能没有足够的空间分配局部变量或者达不到足够的函数调用深度,导致程序异常退出,如果栈的空间开辟太大,那么开设线程所需的内存成本就会上升,系统所支持的线程数就会下降

从堆内存角度来考虑,堆也是向操作系统申请内存空间的,因此堆空间过大,就会导致操作系统可用于线程栈的内存减少,从而间接减少程序所能支持的线程数量

下面是若干次测试

Java Jvm 的分配参数概述

Java堆内存以 900M的大小递增,当栈大小为1M时,最大线程数量以200递减。
当系统的内存空间不足而无法创建新的线程时,会抛出 java.lang.OutOfMemoryError:unable to create new native thread

文章来源:智云一二三科技

文章标题:Java Jvm 的分配参数概述

文章地址:https://www.zhihuclub.com/174398.shtml

关于作者: 智云科技

热门文章

网站地图