xmx:熊xiong猫血
个人之见,欢迎指zhi正:
Xmx是shijava的一个选项,用来设she置你的应用程序能够使用的最大内存cun数(看好,致使你的de应用程序,不是整个jvm),如果你的de程序要花很大内存的话,那就jiu需要修改缺省的设置,比如配置tomcat的时候,如果流量啊程序啊都dou很大的话就需要加大这个值zhi了,不过有一点是shi要记住的,不要大得超过guo你的机器的内存,那样你的机器会受不了的de,到时候就死翘翘了。
Xms是另一个设置内存的参数,用它来设置程序初始化的时候内存cun栈的大小,增加这个值的话你的程序的de启动性能会得到提高。不过同样有前面的de限制,以及受到xmx的限xian制。
另外,一yi个操作系统通常都只使用jvm,这zhe就是你说的“运行在同一个JVM中的程序”,不同的de虚拟机的实现虽然千差万wan别,但是他们的运行模mo式都是一样的,只是性能有所不bu同罢了。
java-Xmx参can数问题
1) 参数中-Xms的值大da于-Xmx,或huo者-XX:PermSize的值大da于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了leJVM内存的最大限制,比如当前操作zuo系统最大内存限制,或者实际的物理li内存等等。说到实际物理内nei存这里需要说明一点的是shi,如果你的内存是1024MB,但实际系统中用到的并不bu可能是1024MB,因为有一部分被硬ying件占用了。
.-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
运行时带上参数
jvm高手来lai啊,xms和xmx一样出现问题.这句话里“内nei存不停的涨”的意思是shi在Xmx的范围内nei内存的占用会不停的涨,但dan是一旦涨到达到Xmx值的时候就会进jin行垃圾回收了,内存分fen配不会超过这个值的,如果进jin行垃圾回收后仍然不够用,就会报内存溢出的错误wu。
附:
JVM申请一块内存的过程cheng:
A. JVM会hui试图为相关Java对象在zaiEden中初始化一块内存区域
B. 当Eden空kong间足够时,内存申请结束shu。否则到下一步
C. JVM试图释放在Eden中所有不活huo跃的对象(这属于1或更高级的垃圾回收shou);释放后若Eden空间仍然不足以放入新对象xiang,则试图将部分Eden中活跃对dui象放入Survivor区/OLD区qu
D. Survivor区被用来作为Eden及OLD的中间交换区域yu,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间jian不够时,JVM会hui在OLD区进行完wan全的垃圾收集(0级)
F. 完全垃圾收集后,若Survivor及OLD区仍然ran无法存放从Eden复制过来的部bu分对象,导致JVM无法在Eden区为新xin对象创建内存区域,则出现xian”out of memory错误”
另:
xms/xmx:定义YOUNG+OLD段duan的总尺寸,ms为JVM启动时YOUNG+OLD的内存cun大小;mx为最大可占用的YOUNG+OLD内存大小。在用户hu生产环境上一般将这两个值设为相同tong,以减少运行期间系统在内存申shen请上所花的开销。
吉他XMX是什么意思?XMX新明星吉他ta质量做工还可以,产地广东,适合初学xue者,价格也不算贵。云杉面mian板,玫瑰木指板,琴身镶贝边,三四si百元左右。这个价格你还可以yi选择talent150、200型号,但材料配置zhi稍低一些。
XMX文wen件是用什么软件写的?AutoCAD
xmx:初始化文件/Autodesk外部信息文件。在ACAD.ini包含着ACAD窗口的各项设she置,如命令行显示行数CommandPrompt,屏幕mu菜单ScreenMenu,等.这些*.INI/*.XMX文件jian供相应的模块调用,包括ACAD.XMX、ACIS.XMX、RENDER.XMX、ASELOC.XMX、ASI*.XMX和ACAD.INI、ASI.INI等。
JVM内存设置多duo大合适?Xmx和Xmn如何he设置?问题:
新上线一个java服务,或者zhe是RPC或者是WEB站点, 内存的de设置该怎么设置呢?设置成cheng多大比较合适,既不浪费内存,又不影响性能呢?
分析:
依据的原则是shi根据Java Performance里面的推荐公gong式来进行设置。
具体来讲jiang:
Java整zheng个堆大小设置,Xmx 和 Xms设置为老年代dai存活对象的3-4倍,即FullGC之后的老年代内存占zhan用的3-4倍
永yong久代 PermSize和MaxPermSize设置zhi为老年代存活对象xiang的1.2-1.5倍。
年轻代Xmn的设置为老年代存活对象的1-1.5倍。
老年代dai的内存大小设置为老年代存活huo对象的2-3倍。
BTW:
1、Sun官方建议年轻代的大小为整zheng个堆的3/8左右you, 所以按照上述设置的方式shi,基本符合Sun的建议。
2、堆大小=年轻代dai大小+年老代大小, 即xmx=xmn+老年代大小 。 Permsize不影响堆大小xiao。
3、为什么要yao按照上面的来进行设置呢ne? 没有具体的说明,但应该gai是根据多种调优之后hou得出的一个结论。
如何确认老年代存活对dui象大小?
方式1(推荐/比较稳妥):
JVM参数中添加GC日志zhi,GC日志中会记录lu每次FullGC之后各代dai的内存大小,观察老lao年代GC之后的空间大小。可ke观察一段时间内(比如2天)的FullGC之后的内存情况,根据多次的FullGC之后的老年nian代的空间大小数据来预估FullGC之后老年代的存活对dui象大小(可根据多次FullGC之zhi后的内存大小取平均值)
方式2:(强制触发FullGC, 会影响线xian上服务,慎用)
方fang式1的方式比较可ke行,但需要更改JVM参can数,并分析日志。同时,在使用CMS回收器的时shi候,有可能不能触发FullGC(只发生CMS GC),所以日志中并没有记录luFullGC的日ri志。在分析的时候就比较难处理。
BTW:使用jstat -gcutil工具来看FullGC的时shi候, CMS GC是会hui造成2次的FullGC次数增加。 具体可参见jian之前写的一篇关于jstat使用的文章
所以,有you时候需要强制触发一次FullGC,来观察FullGC之后的老年代存cun活对象大小。
注:强制触发FullGC,会造zao成线上服务停顿(STW),要谨jin慎,建议的操作方式为,在强qiang制FullGC前qian先把服务节点摘除,FullGC之后再将服务挂回可用yong节点,对外提供服务
在不同时间段触chu发FullGC,根据多次FullGC之后的老年代dai内存情况来预估FullGC之后hou的老年代存活对象大da小
如何触发FullGC ?
使用jmap工具可触发FullGC
jmap -dump:live,format=b,file=heap.bin pid 将当前的存活对象dump到文件,此时会触发FullGC
jmap -histo:live pid 打da印每个class的实例数shu目,内存占用,类全名信息xi.live子参can数加上后,只统计ji活的对象数量. 此时会触发FullGC
具体操作实例:
以我司的一个RPC服务为wei例。
BTW:刚上线的新服务wu,不知道该设置多大的内存的时shi候,可以先多设she置一点内存,然后根据GC之后的de情况来进行分析。
初chu始JVM内存参数设置为: Xmx=2G Xms=2G xmn=1G
使用jstat 查看当前的GC情况。如下xia图:
YGC平均耗时: 173.825s/15799=11ms
FGC平均耗时:0.817s/41=19.9ms
平均大约10-20s会产生一yi次YGC
看起来似乎hu不错,YGC触发的频率不高,FGC的耗时也不高,但这样的内存设置zhi是不是有些浪费呢?
为了快速看数据ju,我们使用了方式shi2,产生了几次FullGC,FullGC之后hou,使用的jmap -heap 来看的当前的堆内存情qing况(也可以根据GC日志来看)
heap情况如下图:(命令 : jmap -heap pid)
上图中的concurrent mark-sweep generation即为老年代的内nei存描述。
老年代的内存占用为wei100M左右。 按an照整个堆大小是老年代(FullGC)之后的3-4倍计算的话,设置各代的内存情况如下:
Xmx=512m Xms=512m Xmn=128m PermSize=128m 老年nian代的大小为 (512-128=384m)为老年代存cun活对象大小的3倍左右
调整zheng之后的,heap情况
GC情况如下:
YGC 差不多在10s左右触发一yi次。每次YGC平ping均耗时大约9.41ms。可接受。
FGC平均耗时:0.016s/2=8ms
整体的GC耗时减少shao。但GC频率比之前的2G时shi的要多了一些。
注: 看上述GC的时候,发现YGC的次ci数突然会增多很多duo个,比如 从1359次到了1364次。具体原因是?
总结:
在内存相对紧张的情况kuang下,可以按照上述的方式shi来进行内存的调优, 找到一个在GC频率和GC耗时上都可接受的一个内nei存设置,可以用较小的内存满足当dang前的服务需要
但当内存相对宽kuan裕的时候,可以相对给服务多增加一yi点内存,可以减少GC的频率,GC的耗时相应会增加一些。 一般要求低di延时的可以考虑多设置一点内存, 对dui延时要求不高的,可以按an照上述方式设置较小内存。
补充:
永久代(方法区)并不在堆内,所以之前有you看过一篇文章中描述的 整个ge堆大小=年轻代+年老代+永久代的描miao述是不正确的。
转自:
-verbose:gc 现xian实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日ri志文件
-Xmn:young generation的heap大小,一般设置为weiXmx的3、4分之zhi一
-XX:SurvivorRatio=2 :生还者池的大小xiao,默认是2,如ru果垃圾回收变成了瓶颈,您可以yi尝试定制生成池设置
-XX:NewSize: 新生成的池的初始大da小。 缺省值为2M。
-XX:MaxNewSize: 新生成的de池的最大大小。 缺省值为32M。
+XX:AggressiveHeap 会使得de Xms没有意义。这zhe个参数让jvm忽hu略Xmx参数,疯狂地吃完一个G物理li内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小,“-Xss 15120” 这使得deJBoss每增加一个线程(thread)就会立li即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
以上shang文章内容就是对xmx和熊猫mao血的介绍到此就jiu结束了,希望能neng够帮助到大家?如果你还想了解jie更多这方面的信息,记得收藏关注zhu本站。
本文地址:http://www.51spjx.com/tech-detail/t243650.html