关于Jvm最大最小内存设置的问题
答案:2 悬赏:20 手机版
解决时间 2021-02-07 01:19
- 提问者网友:寂寞撕碎了回忆
- 2021-02-06 18:29
在网上看到这样一种说法,Jvm的内存设置是针对虚拟内存说的,即系统再怎么样也要保证留出最小内存大小的内存给Jvm用。而Jvm最大也不会超出最大内存的使用。那么假使系统很极限的使用了内存,只给Jvm留出了最小内存如512M,这时Jvm使用频率也高了,虽然没有达到最大内存但也超过了最小内存,如:700M。这时系统的内存会怎么分配,是Jvm妥协报内存溢出或其他错误,还是系统妥协,给Jvm留下足够运行的内存空间?
最佳答案
- 五星知识达人网友:人间朝暮
- 2021-02-06 19:20
在一定范围内,是会分配多一些内存的
全部回答
- 1楼网友:掌灯师
- 2021-02-06 19:45
分析了当前比较流行的几个不同公司不同版本jvm的最大内存,得出来的结果如下:
公司jvm版本 最大内存(兆)client 最大内存(兆)server
sun 1.5.x 1492 1520
sun 1.5.5(linux) 2634 2660
sun 1.4.2 1564 1564
sun 1.4.2(linux) 1900 1260
ibm 1.4.2(linux) 2047 n/a
bea jrockit 1.5 (u3) 1909 1902
除非特别说明,否则jvm版本都运行在windows操作系统下
通过这个表想说明的是,如果你的机器的内存太多的话,只能通过多运行几个实例来提供机器的利用率了,例如跑tomcat,你可以多装几个tomcat并做集群,依此类推。
堆(heap)和非堆(non-heap)内存按照官方的说法:“java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 java 虚拟机启动时创建的。”“在jvm中堆之外的内存称为非堆内存(non-heap memory)”。可以看出jvm主要管理两种类型的内存:堆和非堆。简单来说堆就是java代码可及的内存,是留给开发人员使用的;非堆就是jvm留给自己用的,所以方法区、jvm内部处理或优化所需的内存(如jit编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配jvm初始分配的内存由-xms指定,默认是物理内存的1/64;jvm最大分配的内存由-xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,jvm就会增大堆直到-xmx的最大限制;空余堆内存大于70% 时,jvm会减少堆直到-xms的最小限制。因此服务器一般设置-xms、-xmx相等以避免在每次gc 后调整堆的大小。 非堆内存分配jvm使用-xx:permsize设置非堆内存初始值,默认是物理内存的1/64;由xx:maxpermsize设置最大非堆内存的大小,默认是物理内存的1/4。 jvm内存限制(最大值)首先jvm内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,jvm内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4gb,但是具体的操作系统会给一个限制,这个限制一般是2gb-3gb(一般来说windows系统下为1.5g-2g,linux系统下为2g-3g),而64bit以上的处理器就不会有限制了。
所以说设置vm参数导致程序无法启动主要有以下几种原因:
1) 参数中-xms的值大于-xmx,或者-xx:permsize的值大于-xx:maxpermsize;2) -xmx的值和-xx:maxpermsize的总和超过了jvm内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯