`
qilixiang012
  • 浏览: 204037 次
文章分类
社区版块
存档分类
最新评论

java JVM的内存分配

 
阅读更多
按照官方的说法:Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。在JVM中堆之外的内存称为非堆内存。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所有方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆内存分配:
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64,默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。MinHeapFreeRatio参数可以调整。
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4,空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。MaxHeapFreeRatio参数可以调整。
因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
堆内存内部分配:
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。整个堆大小=新生代大小+老生代大小+永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
非堆内存分配:
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
线程分配:
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用,如果栈不是很深,应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。




内存相关常见JVM参数



感谢金丝燕大学校长

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics