JVM原理之内存分配参数

来源:互联网 发布:excel表格重复数据合并 编辑:程序博客网 时间:2024/06/02 04:51

调优目标

  1. 应用程序的请求量很大时,容易造成频繁的full gc。full gc频繁会导致java应用出现停顿。
  2. JVM调优主要从年轻代,老年代,永久代等方面去调整参数,同时需要掌握JVM内存管理机制,设置符合自己应用的参数值。

JVM参数-最大堆内存

  1. JVM最大堆内存是指年轻代与老年代的大小之和,是应用程序中堆大小的上限。
  2. 在JVM中,通过-Xmx参数设置堆的最大值。
  3. 在应用程序中,通过Runtime.getRuntime().maxMemory()取得最大堆值大小。

JVM参数-最小堆内存

  1. JVM堆最小值是指java应用程序在启动时,JVM分配给堆的内存空间,也是占据操作系统内存空间的大小。
  2. java应用程序会尽量保证在-Xms指定的空间中运行程序。当-Xms申请的空间不够用时,JVM会向操作系统申请内存空间,直至到最大内存空间为止(-Xmx指定的数值)
  3. 如果JVM堆最小值设置过小,则JVM会频繁进行Min gc,同时增加Full gc的次数,会影响应用程序的性能。
  4. 通过-Xms设置JVM堆内存的最小值。

实际设置建议

  1. 增大-Xms的数值,可以减少触发Full gc的次数。最好将-Xmx和-Xms的数值设置成一样大,可以减少内存申请带来的伸缩压力和减少GC的次数。

JVM参数-新生代

  1. JVM中通过-Xmn可以设置新生代大小。新生代设置的大小对应用的性能和GC行为有很大影响。新生代大小一般设置为整个堆空间的1/4到1/5。
  2. 在HotSpot虚拟机中,-XX:NewSize设置新生代的初始大小;-XX:MaxNewSize设置新生代的最大值。
  3. 如果只是设置了-Xmn,则表明-XX:NewSize和-XX:MaxNewSize大小设置相同。在实际应用中,新生代的最小值和最大值要设置相同,减少内存申请带来的动荡。

JVM参数-持久代

  1. 持久代也就是方法区,不属于堆的部分。持久代的大小决定了系统可以容纳多少个类的定义和常量。
  2. 通过-XX:PermSize设置持久代的最小值,-XX:MaxPermSize设置持久代的最大值。
  3. 实际应用中,通常将-XX:PermSize和-XX:MaxPermSize设置同样的大小
  4. 通常持久代设置为64M,128M,也有设置256M或者更大,要根据应用程序特点灵活设置

JVM参数-线程栈

  1. 线程栈属于线程私有的,主要是方法执行时,创建栈帧。
  2. JVM通过-Xss参数设置线程栈的大小。
  3. 线程栈设置太小,容易造成线程异常退出。线程栈设置太大,造成线程成本上升,对系统的吞吐量有影响。
  4. 线程栈,java堆,方法区都要占用操作系统内存空间。如果线程栈设置过大,操作系统物理内存空间是有限的,每增加一个线程请求,就要额外向OS申请内存空间。所以线程栈不能设置太大,同时,java堆也不要设置过大,满足应用性能即可。
  5. 如果堆内存设置过大,同时系统并发量又很大,容易造成线程空间不足,造成内存溢出,OutOfMemoryError。
  6. 高并发的应用中,设置一个较小的线程栈和较小的堆空间。

JVM参数-堆比例分配

  1. 在JVM中,堆分为主要分为老年代,年轻代。其中,年轻代又分为Eden区,from surivior(s0)和to surivior (s1)三部分。在应用中,年轻代与老年代的分配比例是多少,是比较合适的呢?或者通过什么方式可以调整年轻代与老年代的比例?
  2. 对于年轻代堆,from surivior和to surivior空间是1:1大小。可以通过参数-XX:SuriviorRatio设置年轻代中Eden区与from surivior的比例关系。其中so和s1职能相同,大小相同,Minor gc后,互换角色。
    2.1. 例如:-Xmn10M -XX:SurvivorRatio=8,即Eden占据80%的年轻代空间,大小为8M。so,s1都是1M。
  3. 参数-XX:NewRatio 可以用来设置老年代与年轻代的比例。即-XX:NewRatio=老年代/年轻代
    3.1. 例如,-XX:+PrintGCDetails -XX:NewRatio=2 -XX:Xmx20M -XX:Xms20M。 则表明老年代与年轻代比例为2:1,则年轻代空间为20*(1/1+2)=6M。

JVM参数-堆分配参数总结

  1. -Xms:设置最小堆值
  2. -Xmx:设置最大堆值
  3. -Xmn:设置年轻代值(设置它等于最小值和最大值相同)
  4. -XX:NewSize:设置年轻代最小值
  5. -XX:MaxNewSize:设置年轻代最大值
  6. -Xss:设置线程栈值大小
  7. -XX:PermSize:设置永久代最小值
  8. -XX:MaxPermSize:设置永久代最大值
  9. -XX:SuriviorRatio:设置年轻代中Eden与s0的比例
  10. -XX:NewRatio:设置老年代与年轻代的比例。
  11. -XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当堆空间的空闲比例小于这个数值时,JVM变主动申请内存空间。
  12. -XX:MaxHeapFreeRation:设置堆空间最大空闲比例。当堆空间的空闲比例大于这个数值时,JVM会压缩堆空间,得到一个较小的堆空间。
  13. -XX:TargetSuriviorRatio:设置surivior空间使用率,当surivior空间使用率达到这个数值时,会将对应的对象送入老年代。
原创粉丝点击