打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JVM内存配置参数说明

    首先先说一下JVM内存结构问题,JVM为两块:PermanentSapce和HeapSpace,
    其中HeapSpace= {Old + NEW {= Eden , from, to } };PermantSpace主要负责存放加载的Class类级对象如class本身,
    method,field等反射对象,一般不用配置。JVM的Heap区可以通过-X参数来设定。
    当一个URL被访问时,内存申请过程如下:
      A. JVM会试图为相关Java对象在Eden中初始化一块内存区域;
      B. 当Eden空间足够时,内存申请结束。否则到下一步;
      C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),
      释放后若Eden空间仍然不足以放入新对象,
      则试图将部分Eden中活跃对象放入Survivor区;
      D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,
      Survivor区的对象会被移到Old区,
      否则会被保留在Survivor区;
      E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级;
      F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,
      导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误。

 

JVM参数介绍和调优建议:

    Xms/Xmx:定义NEW+OLD段的总尺寸,ms为JVM启动时NEW+OLD的内存大小;
    mx为最大可占用的NEW+OLD内存小。在用户生产环境上一般将这两个值设为相同,
    以减少运行期间系统在内存申请上所花的开销;
    NewSize/MaxNewSize:定义单独NEW段的尺寸,NewSize为JVM启动时NEW的内存大小;
    MaxNewSize为最大可占用的NEW的内存大小。在用户生产环境上一般将这两个值设为相同,
    以减少运行期间系统在内存申请上所花的开销;

    Xms/Xmx和NewSize/MaxNewSize定义好后,OLD区间也自然定义完毕了,
    即OLD区初始大小=(Xms-NewSize),OLD区最大可占用大小=(Xmx-MaxNewSize);
    PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;
    MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,
    以减少运行期间系统在内存申请上所花的开销;

SurvivorRatio:设置Survivor空间和Eden空间的比例。

以上各值的最大值与初始值的差值为各区段的virtual区,这部分保留的内存不会被其他进程使用。


内存溢出的可能性
    1. OLD段溢出
      这种内存溢出是最常见的情况之一,产生的原因可能是:
        1) 设置的内存参数过小(Xms/Xmx, NewSize/MaxNewSize)
        2) 程序问题
           单个程序持续进行消耗内存的处理,如循环几千次的字符串处理,对字符串处理应建议使用StringBuffer。
  此时不会报内存溢出错,却会使系统持续垃圾收集,无法处理其它请求,相关问题程序可通过Thread Dump获取
 (见系统问题诊断一章)单个程序所申请内存过大,有的程序会申请几十乃至几百兆内存,
 此时JVM也会因无法申请到资源而出现内存溢出,对此首先要找到相关功能,然后交予程序员修改,
 要找到相关程序,必须在Apache日志中寻找。当Java对象使用完毕后,其所引用的对象却没有销毁,
 使得JVM认为他还是活跃的对象而不进行回收,这样累计占用了大量内存而无法释放。
 由于目前市面上还没有对系统影响小的内存分析工具,故此时只能和程序员一起定位。

    2. Perm段溢出
       通常由于Perm段装载了大量的Servlet类而导致溢出,目前的解决办法:
       1) 将PermSize扩大,一般256M能够满足要求
       2) 若别无选择,则只能将servlet的路径加到CLASSPATH中,但一般不建议这么处理
    3. C Heap溢出
       系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存

 

其他:

-Xnoclassgc:disable class garbage collection ,这个选项用来取消系统对特定类的垃圾回收。
它可以防止当这个类的所有引用丢失之后,这个类仍被引用时不会再一次被重新装载,因此这个选项将增大系统堆内存的空间。

-Xss:set java thread stack size,这个选项用来控制本地线程栈的大小,
当这个选项被设置的较大(>2MB)时将会在很大程度上降低系统的性能。因此在设置这个值时应该格外小心,
调整后要注意观察系统的性能,不断调整以期达到最优
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WebLogic MEM_ARGS 參數設定
第9课:jvm的gc时候核心参数详解:
【转】Tomcat内存溢出的三种情况及解决办法分析
JVM GC调优
JVM内存:年轻代、老年代、永久代(推荐 转)
JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服