java 堆_Java中的堆分配参数总结《对Java的分析总结》(二)

《对Java的分析总结》-Java中的堆分配参数总结


b5514427fbe0ff3b0750b2ac58f0e581.png

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

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

下面是若干次测试

jvm配制-Xss1M(每个线程栈占1M)-Xss20M(每个线程栈占20M)-Xmx100M -Xms100M176779-Xmx300M -Xms100M156769-Xmx500M -Xms100M146759

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值