`

JAVA_OPTS参数-Xms和-Xmx的作用

阅读更多

因为调试eclispe,断修改初始内存参数,只设一个-Xmx是不够的,还必须设置-Xms,开始怀疑初始化参数的作用。废话不多说,开始研究。网上的好资料不多,有一篇解释还比较清楚,就拿来主义了。

最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(), totalMemory(), maxMemory()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有 一两兆字节,而随着java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对 freeMemory()这个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实根本就不是这样的。这三个方法反映的都是 java这个进程的内存情况,跟操作系统的内存根本没有关系。下面结合totalMemory(), maxMemory()一起来解释。

maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp you_classpath -Xmx512m your_class,那么最大内存就是512*1024*1024字节。

totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有 内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 到挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖 -Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。

freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程 序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。

自己写的一段小程序,用来帮助理解!java -cp . Getmem和java -cp . -Xms80m -Xmx80m Getmem比较!

Code
public class Getmem {
    static int limit = 2000000;
    public Getmem() {
    }
   
    public static void main(String args[]) {
        getCurMem();
        waitFor5s();
       
        String tmpArray[] = new String[limit];
        getCurMem();
        waitFor5s();
       
        for (int i = 0; i < limit; i++) {
            tmpArray[i] = new String("abcde");
        }
        getCurMem();
        waitFor5s();
    }
   
    static float bitTomega(long bit) {
        return (float)bit/1024/1024;
    }
   
    static void getCurMem() {
        SimpleDateFormat tmpDate = new SimpleDateFormat("yyyy-MM-dd" + " " + "hh:mm:ss");
        System.out.println(tmpDate.format(new Date()));
        System.out.println("   current memory: " + bitTomega(Runtime.getRuntime().totalMemory()) + "M");
        System.out.println("   max memory: " + bitTomega(Runtime.getRuntime().maxMemory()) + "M");
        System.out.println("   free memory: " + bitTomega(Runtime.getRuntime().freeMemory()) + "M");
    }
   
    static void waitFor5s() {
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
PS: xp系统自带的任务管理器对于java的内存反应不是很靠谱,新版的还不错,process explorer!

摘自:http://sun-xyun.iteye.com/blog/416054

分享到:
评论

相关推荐

    JAVA_SET_enviroment

    NULL 博文链接:https://jbeduhai.iteye.com/blog/1746837

    jdk 环境变量 JAVA_HOME 批处理文件 双击搞定

    jdk 环境变量 JAVA_HOME 批处理文件 双击搞定 最多只需修改个JAVA-HOME,其他的classpath path之类的bat文件搞定

    jdk1.8.0_171-linux-x64

    oracle官方下载,本jdk是linux版,下载后配置环境变量后可直接使用 环境变量配置 1、打开配置文件: # sudo vim /etc/profile ... export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx2048m -XX:PermSize=512m

    tomcat内存溢出的设置

    tomcat内存溢出的设置

    解析Tomcat的启动脚本–catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 catalina.bat 脚本. 至于 setclasspath.bat 这个脚本, 相信看完这一篇, ...

    es以及kibana的镜像压缩包

    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins --privileged --network es-...

    IPQueue机制

    IP Queue机制

    tomcat6.0 修改启动内存设置 java jvm参数配置

    添加:JAVA_OPTS='-Xms512m -Xmx1024m' 要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。 -Xms:初始值 -Xmx:最大值 -Xmn:最小值 解决办法: 修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache ...

    tomcat常用功能的配置

    1,修改tomcat的JDK目录 2,增加虚拟目录 3,GET方法URL乱码问题解决 4,虚拟主机配置 等等

    Jenkins启动脚本.zip

    JAVA_OPTS="-Xms512M -Xmx1024M -Xss256K -XX:+UseAdaptiveSizePolicy -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:GCTimeRatio=39 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$GC_PATH -XX:+...

    快速学习-Kafka 监控

    export KAFKA_HEAP_OPTS=-Xmx1G -Xms1G fi 为 if [ x$KAFKA_HEAP_OPTS = x ]; then export KAFKA_HEAP_OPTS=-server -Xms2G -Xmx2G -XX:PermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200

    基于Docker快速搭建ELK6.7.0.zip

    用最简单的方法做复杂的工作:基于Centos7.2+Docker18.03.1-ce快速搭建ELK6.7.0!

    maven可以帮助者我们完成一站式部署

    具。 maven可以帮助者我们完成一站式部署。依赖管理、自动生成项目站点 maven的安装与配置 1.... 从网络将maven下载. 直接解压就可以. 2.... set MAVEN_OPTS= -Xms128m -Xmx512m

    扩大Tomcat内存

    set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M 方法二:环境变量中设 变量名:JAVA_OPTS 变量值:-Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M...

    分别在Linux和Windows下设置JVM内存的简单方法

    添加:JAVA_OPTS=’-Xms512m -Xmx1024m’ 或者 JAVA_OPTS=”-server -Xms800m -Xmx800m  -XX:MaxNewSize=256m” 或者 CATALINA_OPTS=”-server -Xms256m -Xmx300m” Windows服务器: 在/apache-tomcat-5.5.23/bin ...

    jadx-gui-1.0.0dev最新版本,支持中文,2019年8月31日编译

    如需修改内存,请修改-Xmx8g字段。 @rem Add default JVM options here....set DEFAULT_JVM_OPTS="-Xms128M" "-Xmx8g" "-Dawt.useSystemAAFontSettings=lcd" "-Dswing.aatext=true" "-XX:+UseG1GC

    jadx-0.8.0

    jadx-0.8.0版本,更新内容: 修复反混淆 许多针对try / catch块和循环的修复 加快搜索框的搜索的速度 修复内存泄漏 可以显示app证书 window直接运行bin目录中的jadx-gui...或 set DEFAULT_JVM_OPTS="-Xms128M" "-Xmx4g

    Tomcat+Mysql高并发配置优化讲解

    setJAVA_OPTS=-server -Xms1024m -Xmx2048m -Xss512K -XX:PermSize=128m-XX:MaxPermSize=256m setCATALINA_OPTS=-server -Xms512m -Xmx512m 如下图: Xms:初始内存 Xmx:最大内存 (2)更改Tomcat的Server.xml 在 ...

    Linux和Windows中tomcat修改内存大小的方法

    实例,以下给出1G内存环境下java jvm 的参数设置参考: 代码如下:JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true ”JAVA_OPTS=”-...

    eclipse_bat

    ECHO OFF IF NOT EXIST WebGoat_5_2_workspace GOTO UNPACK set JAVAHOME=java set PATH=%JAVAHOME%\bin;%PATH% set ECLIPSE_HOME=eclipse SET JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx768m

Global site tag (gtag.js) - Google Analytics