- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JAVA内存优化 毕玄
1、Java虚拟机运行时的数据区
2、常用的内存区域调节参数
-Xms:初始堆大小,默认为物理内存的1/64(1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会
增大堆直到-Xmx 的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是 (eden+ 2survivor space)。与jmap -heap中显示的New gen是不同的。
整个堆大小 新生代大小 + 老生代大小 + 永久代大小。
在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,
一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进
行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经
验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是 128k够用的,大的应用建议使用256k。这个选项对性能影响比
较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:-Xss istranslated ina
VMflag namedThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(permgen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
3、内存分配方法
1)堆上分配 2)栈上分配 3)堆外分配 (DirectByteBuffer或直接使用Unsafe.allocateMemory,但不推荐这种方式)
4、监控方法
1)系统程序运行时可通过jstat –gcutil来查看堆中各个内存区域的变化以及GC的工作状态;
2)启动时可添加-XX:+PrintGCDetails –Xloggc:file输出到日志文件来查看GC的状况;
3)jmap –heap可用于查看各个内存空间的大小;
5)断代法可用GC汇总
一、新生代可用GC
1)串行GC(Serial Copying):client模式下默认GC方式,也可通过-XX:+UseSerialGC来强制指定;默认情况下 eden、s0、s1
的大小通过-XX:SurvivorRatio来控制,默认为8,含义
为eden:s0的比例,启动后可通过jmap –heap [pid]来查看。
默认情况下,仅在TLAB或eden上分配,只有两种情况下会在老生代分配:
1、需要分配的内存大小超过edenspace大小;
2、在配置了PretenureSizeThreshold的情况下,对象大小大于此值。
默认情况下,触发MinorGC时:
之前MinorGC晋级到old的平均大小 老生代的剩余空间 eden+fromSurvivor的使用空间。当HandlePromotionFailure
为true,则仅触发minorgc;如为false,则触发fullGC。
默认情况下,新生代对象晋升到老生代的规则:
1、经历多次minorgc仍存活的对象,可通过以下参数来控制:以MaxTenuringThreshold值为准,默认为 15。
2、to space放不下的,直接放入老生代;
2)并行GC (ParNew):CMS GC时默认采用,也可采用-XX:+UseParNewGC强制指定;垃圾回收的时候采用多线程的方式。
3)并行回收GC(ParallelScavenge):server模式下默认的GC方式,也可采用-XX:+UseParallelGC强制指定;eden、s0、s1的
大小可通过-XX:SurvivorRatio来控制,但默认情况下
以-XX:InitialSurivivorRatio为准,此值默认为8,代表的为新生代大小 :s0,这点要特别注意。
默认情况下,当TLAB、eden上分配都失败时,判断需要分配的内存大小是否 edenspace的一半大小,如是就直接在老生代
上分配;
默认
文档评论(0)