zoukankan      html  css  js  c++  java
  • 有关内存的常用配置参数

    几个非常常用的内存配置参数:

    -Xms
      JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存,也可以减少垃圾回收次数;开发测试机JVM可以保留默认值。(例如:-Xms4g)
      -Xmx
      JVM可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列。最佳设值应该视物理内存大小及计算机内其他内存开销而定。(例如:-Xmx4g)
    看个例子,做个对比试验,-Xms和-Xmx设为不同和相同值,用代码对比一下,看看回收次数的变化:
    先给jvm这么一个配置:-Xms5M -Xmx20M -XX:+PrintGCDetails -XX:+UseSerialGC
    public class JvmTest {
    public static void main(String[] args) {
    byte[] bs = new byte[1*1024*1024];
    System.out.println("分配了1M的内存空间");
    jvmInfo();
    byte[] bs1 = new byte[4*1024*1024];
    System.out.println("分配了4M的内存空间");
    jvmInfo();
    }
    public static String toM(long byteNum) {
    float num = byteNum/(1024*1024);
    DecimalFormat df = new DecimalFormat("0.00");
    String str = df.format(num);
    return str;
    }
    public static void jvmInfo() {
    //获取配置的最大内存
    long maxMemory = Runtime.getRuntime().maxMemory();
    System.out.println("maxMemory:" + maxMemory + "字节," + toM(maxMemory) + "M");
     
    //获取空闲的内存大小
    long freeMemory = Runtime.getRuntime().freeMemory();
    System.out.println("freeMemory:" + maxMemory + "字节," + toM(freeMemory) + "M");
     
    //获取当前使用掉的内存大小
    long totalMemory = Runtime.getRuntime().totalMemory();
    System.out.println("totalMemory:" + maxMemory + "字节," + toM(totalMemory) + "M");
    }
    }
     
      -Xmn (jdk1.4以后将-XX:NewSize和-XX:MaxNewSize合一,因为我们设置他们的时候也建议设置一样大)
      Java Heap Young区大小。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(相对于HotSpot 类型的虚拟机来说)。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。(例如:-Xmn2g)
     
    老年代用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:
    1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。
    2、大的数组对象,且数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
     
      -Xss
      Java每个线程的Stack大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。(推荐:小系统:-Xss126K,大系统:-Xss256K)
     
     -XX:PermSize
      持久代(方法区)的初始内存大小。(例如:-XX:PermSize=64m)
     -XX:MaxPermSize
      持久代(方法区)的最大内存大小。(例如:-XX:MaxPermSize=512m)
     -XX:+MaxTenuringThreshold=10
      垃圾的最大年龄,代表对象在Survivor区经过10次复制以后才进入老年代。如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。
     
    注意:tomcat中的配置内存参数可以放在 catalina.sh或者catalina.bat的第二行:
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms1800m -Xmx1800m -Xmn600m -XX:PermSize=512M -XX:MaxPermSize=512m -Xss128K -XX:+PrintGCDetails
     -----------------------------------------------------------------

    堆大小设置:
    -Xms:JVM启动时申请的初始Heap值
    -Xmx:JVM可申请的最大Heap值
    Server端JVM最好将-Xms和-Xmx设为相同值
    -XX:MaxHeapFreeRation/-XX:MinHeapFreeRation来指定比例
    -------------------------------------------------------

    -Xmn:堆中年轻代,整个堆的3/8
    整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(相对于HotSpot 类型的虚拟机来说)。
    持久代一般固定大小为64m
    -----------------------------------------------------------------------
    -Xss:线程堆栈大小为1M,操作系统对一个进程内的线程数还是有限制的,不能无限生成,经
    验值在3000~5000左右。(推荐:小系统:-Xss126K,大系统:-Xss256K)
    --------------------------------------------------------------------------
    -XX:PermSize
      持久代(方法区)的初始内存大小。(例如:-XX:PermSize=64m)
     -XX:MaxPermSize
      持久代(方法区)的最大内存大小。(例如:-XX:MaxPermSize=512m)
     -XX:+MaxTenuringThreshold=10
      垃圾的最大年龄,代表对象在Survivor区经过10次复制以后才进入老年代。如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。

     
     
     
  • 相关阅读:
    Spring-web初始化流程简图
    记一次升级Tomcat
    Spring-Task思维导图
    2019的第一个工作日
    RocketMQ专题2:三种常用生产消费方式(顺序、广播、定时)以及顺序消费源码探究
    RocketMQ专题1:入门
    博客搬家到云栖社区
    ActiveMQ专题2: 持久化
    ActiveMQ专题1: 入门实例
    linux下怎么卸载自带的JDK和安装想要的JDK
  • 原文地址:https://www.cnblogs.com/danyuzhu11/p/10400550.html
Copyright © 2011-2022 走看看