如何查看java虚拟机内存设置堆内存的参数值

您所在的位置: &
Java虚拟机(JVM)中的内存设置详解
Java虚拟机(JVM)中的内存设置详解
本文向您介绍在Java虚拟机,即JVM中如何设置内存,达到良好的GC效率。
在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。
PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。
GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误
Java Heap分为3个区1.Young2.Old3.Permanent
Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。
JVM的Heap分配可以使用-X参数设定,
-Xms 初始Heap大小-Xmx java heap最大值&
-Xmn young generation的heap大小
JVM有2个GC线程第一个线程负责回收Heap的Young区第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。为什么一些程序频繁发生GC?
有如下原因:1.程序内调用了System.gc()或Runtime.gc()。2.一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。3.Java的Heap太小,一般默认的Heap值都很小。4.频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
Stack的设定每个线程都有他自己的Stack。
-Xss 每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。
1、第一种为单线程GC,也是默认的GC,该GC适用于单CPU机器。2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
单文件的JVM内存进行设置
默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。java -Xms64m -Xmx256m Test-Xms是设置内存初始化的大小-Xmx是设置最大能够使用内存的大小(最好不要超过物理内存大小)
tomcat启动jvm内存设置
在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh添加:JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。-Xms:初始值-Xmx:最大值-Xmn:最小值Windows在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.解决办法:
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"-Xrs加入 -Xms300m -Xmx350m
重起tomcat服务,设置生效
weblogic启动jvm内存设置
在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。
默认可以使用的内存为64MB $JBOSSDIR$/bin/run.config JAVA_OPTS = "-server -Xms128 -Xmx512"
在所在目录下,键入 eclipse.exe -vmargs -Xms256m -Xmx512m 256m表示JVM堆内存最小值 512m表示JVM堆内存最大
进入控制台去设置:应用程序服务器 & server1 & 进程定义 & Java 虚拟机
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&&&的更多文章
您是否在寻找比Java更安全,更简洁,又能跨平台的开发语言? 您
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 367人学习过讲师: 14人学习过讲师: 50人学习过
如何看将流行的JavaScript MVC框架Ember.js? 这款Java
一周一周的过的很快,2013年已经进入了倒计时。开发频
在脚本语言领域,Lua是最快、最高效的脚本语言之一,
Linux出色的网络功能堪称当今操作系统中的佼佼者,无论在功能还是在支持能力上都有令人满意的表现。Linux内置的多个服务器,几乎
51CTO旗下网站用户名:leizhimin
文章数:732
评论数:2723
注册日期:
阅读量:1297
阅读量:3317
阅读量:438789
阅读量:1125617
51CTO推荐博文
Java虚拟机(JVM)参数配置说明
在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。
JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。
另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误。呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。
为了说明这些参数,还需要说说JDK中的命令行工具一些知识做铺垫。
首先看如何获取这些命令配置信息说明:
假设你是windows平台,你安装了J2SDK,那么现在你从cmd控制台窗口进入J2SDK安装目录下的bin目录,然后运行java命令,出现如下结果,这些就是包括java.exe工具的和JVM的所有命令都在里面。
-----------------------------------------------------------------------
D:\j2sdk15\bin&java
Usage: java [-options] class [args...]
&&&&&&&&&& (to execute a class)
&& or& java [-options] -jar jarfile [args...]
&&&&&&&&&& (to execute a jar file)
where options include:
&&& -client&&&&&& to select the "client" VM
&&& -server&&&&&& to select the "server" VM
&&& -hotspot&&&&& is a synonym for the "client" VM& [deprecated]
&&&&&&&&&&&&&&&&& The default VM is client.
&&& -cp &class search path of directories and zip/jar files&
&&& -classpath &class search path of directories and zip/jar files&
&&&&&&&&&&&&&&&&& A ; separated list of directories, JAR archives,
&&&&&&&&&&&&&&&&& and ZIP archives to search for class files.
&&& -D&name&=&value&
&&&&&&&&&&&&&&&&& set a system property
&&& -verbose[:class|gc|jni]
&&&&&&&&&&&&&&&&& enable verbose output
&&& -version&&&&& print product version and exit
&&& -version:&value&
&&&&&&&&&&&&&&&&& require the specified version to run
&&& -showversion& print product version and continue
&&& -jre-restrict-search | -jre-no-restrict-search
&&&&&&&&&&&&&&&&& include/exclude user private JREs in the version search
&&& -? -help&&&&& print this help message
&&& -X&&&&&&&&&&& print help on non-standard options
&&& -ea[:&packagename&...|:&classname&]
&&& -enableassertions[:&packagename&...|:&classname&]
&&&&&&&&&&&&&&&&& enable assertions
&&& -da[:&packagename&...|:&classname&]
&&& -disableassertions[:&packagename&...|:&classname&]
&&&&&&&&&&&&&&&&& disable assertions
&&& -esa | -enablesystemassertions
&&&&&&&&&&&&&&&&& enable system assertions
&&& -dsa | -disablesystemassertions
&&&&&&&&&&&&&&&&& disable system assertions
&&& -agentlib:&libname&[=&options&]
&&&&&&&&&&&&&&&&& load native agent library &libname&, e.g. -agentlib:hprof
&&&&&&&&&&&&&&&&&&& see also, -agentlib:jdwp=help and -agentlib:hprof=help
&&& -agentpath:&pathname&[=&options&]
&&&&&&&&&&&&&&&&& load native agent library by full pathname
&&& -javaagent:&jarpath&[=&options&]
&&&&&&&&&&&&&&&&& load Java programming language agent, see java.lang.instrument
-----------------------------------------------------------------------
在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。
其次,用java -X 命令查看JVM的配置说明:
运行后如下结果,这些就是配置JVM参数的秘密武器,这些信息都是英文的,为了方便阅读,我根据自己的理解翻译成中文了(不准确的地方还请各位博友斧正)
-----------------------------------------------------------------------
D:\j2sdk15\bin&java -X
&&& -Xmixed&&&&&&&&&& mixed mode execution (default)
&&& -Xint&&&&&&&&&&&& interpreted mode execution only
&&& -Xbootclasspath:&directories and zip/jar&
&&&&&&&&&&&&&&&&&&&&& set search path for bootstrap classes and resources
&&& -Xbootclasspath/a:&directories and zip/jar&
&&&&&&&&&&&&&&&&&&&&& append to end of bootstrap class path
&&& -Xbootclasspath/p:&directories and zip/jar&
&&&&&&&&&&&&&&&&&&&&& prepend in front of bootstrap class path
&&& -Xnoclassgc&&&&&& disable class garbage collection
&&& -Xincgc&&&&&&&&&& enable incremental garbage collection
&&& -Xloggc:&file&&&& log GC status to a file with time stamps
&&& -Xbatch&&&&&&&&&& disable background compilation
&&& -Xms&size&&&&&&&& set initial Java heap size
&&& -Xmx&size&&&&&&&& set maximum Java heap size
&&& -Xss&size&&&&&&&& set java thread stack size
&&& -Xprof&&&&&&&&&&& output cpu profiling data
&&& -Xfuture&&&&&&&&& enable strictest checks, anticipating future default
&&& -Xrs&&&&&&&&&&&&& reduce use of OS signals by Java/VM (see documentation)
&&& -Xcheck:jni&&&&&& perform additional checks for JNI functions
&&& -Xshare:off&&&&&& do not attempt to use shared class data
&&& -Xshare:auto&&&&& use shared class data if possible (default)
&&& -Xshare:on&&&&&&& require using shared class data, otherwise fail.
The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------
JVM配置参数中文说明:
-----------------------------------------------------------------------
1、-Xmixed&&&&&&&&&& mixed mode execution (default)
&混合模式执行
2、-Xint&&&&&&&&&&&& interpreted mode execution only
&解释模式执行
3、-Xbootclasspath:&directories and zip/jar&
&&&&& set search path for bootstrap classes and resources
&设置zip/jar资源或者类(.class文件)存放目录路径
3、-Xbootclasspath/a:&directories and zip/jar&
&&&&& append to end of bootstrap class path
&追加zip/jar资源或者类(.class文件)存放目录路径
4、-Xbootclasspath/p:&directories and zip/jar&
&&&&& prepend in front of bootstrap class path
&预先加载zip/jar资源或者类(.class文件)存放目录路径
5、-Xnoclassgc&&&&&& disable class garbage collection
&关闭类垃圾回收功能
6、-Xincgc&&&&&&&&&& enable incremental garbage collection
&开启类的垃圾回收功能
7、-Xloggc:&file&&&& log GC status to a file with time stamps
&记录垃圾回日志到一个文件。
8、-Xbatch&&&&&&&&&& disable background compilation
&关闭后台编译
9、-Xms&size&&&&&&&& set initial Java heap size
&设置JVM初始化堆内存大小
10、-Xmx&size&&&&&&&& set maximum Java heap size
&设置JVM最大的堆内存大小
11、-Xss&size&&&&&&&& set java thread stack size
&设置JVM栈内存大小
12、-Xprof&&&&&&&&&&& output cpu profiling data
&输入CPU概要表数据
13、-Xfuture&&&&&&&&& enable strictest checks, anticipating future default
&执行严格的代码检查,预测可能出现的情况
14、-Xrs&&&&&&&&&&&&& reduce use of OS signals by Java/VM (see documentation)
&通过JVM还原操作系统信号
15、-Xcheck:jni&&&&&& perform additional checks for JNI functions
&对JNI函数执行检查
16、-Xshare:off&&&&&& do not attempt to use shared class data
&尽可能不去使用共享类的数据
17、-Xshare:auto&&&&& use shared class data if possible (default)
&尽可能的使用共享类的数据
18、-Xshare:on&&&&&& require using shared class data, otherwise fail.
&尽可能的使用共享类的数据,否则运行失败
The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------
怎么用这这些参数呢?其实所有的命令行都是这么一用,下面我就给出一个最简单的HelloWorl的例子来演示这个参数的用法,非常的简单。
HelloWorld.java
-----------------------------------------------
public class& HelloWorld
&public static void main(String[] args)
&&System.out.println("Hello World!");
编译并运行:
D:\j2sdk15\bin&javac HelloWorld.java
D:\j2sdk15\bin&java -Xms256M -Xmx512M HelloWorld
Hello World!
呵呵,这下满足了吧!
实践:在大型系统或者应用中配置JVM参数
比如你配置IDE工具的参数,常见的有IDEA、Eclipse,这个是在一个配置文件中指定即可。
如果你要在J2EE环境中配置这些参数,那么你需要在J2EE应用服务器或者Servlet容器相关启动参数设置处指定,其启动文件中来配置,Tomcat是在catalina.bat中配置,weblogic和websphere是在其他地方,具体我就说了,相信玩过的这些大型服务器的人都知道,没玩过的看看这篇文章,玩玩就知道了,呵呵。
另外常常有人问到jdk的一些相关命令用法,其实,当你看到这里的时候,你应该知道如何获取这些命令的用法了。如果你还不会,那么,建议你去学学DOS,我是没辙了。如果你会这些,还是没有看明白,那么你赶紧学学英语吧,这样你就能看懂了。
另外:我在最后给出常用的几个Java命令行说明,以供参考:
(1)、javac
用法:javac &选项& &源文件&
其中,可能的选项包括:
& -g&&&&&&&&&&&&&&&&&&&&&&&& 生成所有调试信息
& -g:none&&&&&&&&&&&&&&&&&&& 不生成任何调试信息
& -g:{lines,vars,source}&&&& 只生成某些调试信息
& -nowarn&&&&&&&&&&&&&&&&&&& 不生成任何警告
& -verbose&&&&&&&&&&&&&&&&&& 输出有关编译器正在执行的操作的消息
& -deprecation&&&&&&&&&&&&&& 输出使用已过时的 API 的源位置
& -classpath &路径&&&&&&&&&&&& 指定查找用户类文件的位置
& -cp &路径&&&&&&&&&&&&&&&&&&& 指定查找用户类文件的位置
& -sourcepath &路径&&&&&&&&&&& 指定查找输入源文件的位置
& -bootclasspath &路径&&&&&&&& 覆盖引导类文件的位置
& -extdirs &目录&&&&&&&&&&&&&& 覆盖安装的扩展目录的位置
& -endorseddirs &目录&&&&&&&&& 覆盖签名的标准路径的位置
& -d &目录&&&&&&&&&&&&&&&&&&&& 指定存放生成的类文件的位置
& -encoding &编码&&&&&&&&&&&&& 指定源文件使用的字符编码
& -source &版本&&&&&&&&&&&&&&& 提供与指定版本的源兼容性
& -target &版本&&&&&&&&&&&&&&& 生成特定 VM 版本的类文件
& -version&&&&&&&&&&&&&&&&&& 版本信息
& -help&&&&&&&&&&&&&&&&&&&&& 输出标准选项的提要
& -X&&&&&&&&&&&&&&&&&&&&&&&& 输出非标准选项的提要
& -J&标志&&&&&&&&&&&&&&&&&&&&& 直接将 &标志& 传递给运行时系统
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
&&& -c& 创建新的存档
&&& -t& 列出存档内容的列表
&&& -x& 展开存档中的命名的(或所有的〕文件
&&& -u& 更新已存在的存档
&&& -v& 生成详细输出到标准输出上
&&& -f& 指定存档文件名
&&& -m& 包含来自标明文件的标明信息
&&& -0& 只存储方式;未用ZIP压缩格式
&&& -M& 不产生所有项的清单(manifest〕文件
&&& -i& 为指定的jar文件产生索引信息
&&& -C& 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
&&&&&& jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
&&&&&&&&&& 文件存档到一个名为 'classes.jar' 的存档文件中:
&&&&&& jar cvfm classes.jar mymanifest -C foo/ .
(3)、javadoc
javadoc: 错误 - 未指定软件包或类。
用法:javadoc [选项] [软件包名称] [源文件] [@file]
-overview &文件&&&&&&&&&& 读取 HTML 文件的概述文档
-public&&&&&&&&&&&&&&&&&& 仅显示公共类和成员
-protected&&&&&&&&&&&&&&& 显示受保护/公共类和成员(默认)
-package&&&&&&&&&&&&&&&&& 显示软件包/受保护/公共类和成员
-private&&&&&&&&&&&&&&&&& 显示所有类和成员
-help&&&&&&&&&&&&&&&&&&&& 显示命令行选项并退出
-doclet &类&&&&&&&&&&&&&& 通过替代 doclet 生成输出
-docletpath &路径&&&&&&&& 指定查找 doclet 类文件的位置
-sourcepath &路径列表&&&& 指定查找源文件的位置
-classpath &路径列表&&&&& 指定查找用户类文件的位置
-exclude &软件包列表&&&&& 指定要排除的软件包的列表
-subpackages &子软件包列表& 指定要递归装入的子软件包
-breakiterator&&&&&&&&&&& 使用 BreakIterator 计算第 1 句
-bootclasspath &路径列表& 覆盖引导类加载器所装入的
&&&&&&&&&&&&&&&&&&&&&&&&& 类文件的位置
-source &版本&&&&&&&&&&&& 提供与指定版本的源兼容性
-extdirs &目录列表&&&&&&& 覆盖安装的扩展目录的位置
-verbose&&&&&&&&&&&&&&&&& 输出有关 Javadoc 正在执行的操作的消息
-locale &名称&&&&&&&&&&&& 要使用的语言环境,例如 en_US 或 en_US_WIN
-encoding &名称&&&&&&&&&& 源文件编码名称
-quiet&&&&&&&&&&&&&&&&&&& 不显示状态消息
-J&标志&&&&&&&&&&&&&&&&&& 直接将 &标志& 传递给运行时系统
通过标准 doclet 提供:
-d &目录&&&&&&&&&&&&&&&&&&&&&&&&& 输出文件的目标目录
-use&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 创建类和软件包用法页面
-version&&&&&&&&&&&&&&&&&&&&&&&&& 包含 @version 段
-author&&&&&&&&&&&&&&&&&&&&&&&&&& 包含 @author 段
-docfilessubdirs&&&&&&&&&&&&&&&&& 递归复制文档文件子目录
-splitindex&&&&&&&&&&&&&&&&&&&&&& 将索引分为每个字母对应一个文件
-windowtitle &文本&&&&&&&&&&&&&&& 文档的浏览器窗口标题
-doctitle &html 代码&&&&&&&&&&&&& 包含概述页面的标题
-header &html 代码&&&&&&&&&&&&&&& 包含每个页面的页眉文本
-footer &html 代码&&&&&&&&&&&&&&& 包含每个页面的页脚文本
-bottom &html 代码&&&&&&&&&&&&&&& 包含每个页面的底部文本
-link &url&&&&&&&&&&&&&&&&&&&&&&& 创建指向位于 &url& 的 javadoc 输出的链接
-linkoffline &url& &url2&&&&&&&&& 利用位于 &url2& 的软件包列表链接至位于 &url&
-excludedocfilessubdir &名称 1&:..排除带有给定名称的所有文档文件子目录。
-group &名称& &p1&:&p2&..&&&&&&&& 在概述页面中,将指定的软件包分组
-nocomment&&&&&&&&&&&&&&&&&&&&&&& 抑止描述和标记,只生成声明。
-nodeprecated&&&&&&&&&&&&&&&&&&&& 不包含 @deprecated 信息
-noqualifier &名称 1&:&名称 2&:...从输出中排除限定符的列表。
-nosince&&&&&&&&&&&&&&&&&&&&&&&&& 不包含 @since 信息
-notimestamp&&&&&&&&&&&&&&&&&&&&& 不包含隐藏时间戳
-nodeprecatedlist&&&&&&&&&&&&&&&& 不生成已过时的列表
-notree&&&&&&&&&&&&&&&&&&&&&&&&&& 不生成类分层结构
-noindex&&&&&&&&&&&&&&&&&&&&&&&&& 不生成索引
-nohelp&&&&&&&&&&&&&&&&&&&&&&&&&& 不生成帮助链接
-nonavbar&&&&&&&&&&&&&&&&&&&&&&&& 不生成导航栏
-serialwarn&&&&&&&&&&&&&&&&&&&&&& 生成有关 @serial 标记的警告
-tag &名称&:&位置&:&标题&&&&&&&&& 指定单个变量自定义标记
-taglet&&&&&&&&&&&&&&&&&&&&&&&&&& 要注册的 Taglet 的全限定名称
-tagletpath&&&&&&&&&&&&&&&&&&&&&& Taglet 的路径
-charset &字符集&&&&&&&&&&&&&&&&& 用于跨平台查看生成的文档的字符集。
-helpfile &文件&&&&&&&&&&&&&&&&&& 包含帮助链接所链接到的文件
-linksource&&&&&&&&&&&&&&&&&&&&&& 以 HTML 格式生成源
-sourcetab &制表符长度&&&&&&&&&&& 指定源中每个制表符占据的空格数
-keywords&&&&&&&&&&&&&&&&&&&&&&&& 使软件包、类和成员信息附带 HTML 元标记
-stylesheetfile &路径&&&&&&&&&&&& 用于更改生成文档的样式的文件
-docencoding &名称&&&&&&&&&&&&&&& 输出编码名称
rmid: 非法选项:-?
用法:rmid &option&
其中,&option& 包括:
& -port &option&&&&&&&& 指定供 rmid 使用的端口
& -log &directory&&&& 指定 rmid 将日志写入的目录
& -stop&&&&&&&&&&&&&& 停止当前的 rmid 调用(对指定端口)
& -C&runtime 标记&&&& 向每个子进程传递参数(激活组)
& -J&runtime 标记&&&& 向 java 解释程序传递参数
还有很多,下班了,放假了,HOHO,五一来了之后再写吧!
有关更多的java命令可以参考一下这个文章:
&本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:┆阅读(0)┆评论(0)
21:48:07 17:39:00 17:16:14 14:05:12 14:05:16 14:05:28 23:39:55 17:47:23 08:44:56 15:31:35 15:46:41 17:06:55 10:50:33(入门贴)JVM堆内存相关的启动参数:年轻代、老年代和永久代的内存分配
如果想观察JVM进程占用的堆内存,可以通过命令工具jmap或者可视化工具jvisualvm.exe。JVM这些启动参数都拥有默认值,如果想了解JVM的内存分配策略,最好手动设置这些启动参数。再通过JDK提供的工具的统计结果,进行对比,就比较容易理解这些内存分配的理论知识。运行环境是win7 32位操作,JDK1.7.0_60版本。
测试代码和JVM启动参数如下:
public class Test
public static void main(String[] args)
int a = 0;
while (true)
}-Xms=200M
-Xmx200M -XX:NewSize=100M -Xmn100M -XX:SurvivorRatio=8
-XX:OldSize=60M -XX:PermSize=50M -XX:MaxPermSize=50M
运行上述代码,通过jps命令获取到进程pid,然后通过jmap -heap pid就可以查看内存分配和使用情况。
>jmap -heap 8912
Attaching to process ID 8912, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 24.60-b09
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize
MaxNewSize
SurvivorRatio
MaxPermSize
这里显示的堆配置参数,都可以通过JVM启动参数来设置。下面来解释下几个重要参数的含义:
-Xms 和 -Xmx (-XX:InitialHeapSize 和 -XX:MaxHeapSize):指定JVM初始占用的堆内存和最大堆内存。JVM也是一个软件,也必须要获取本机的物理内
存,然后JVM会负责管理向操作系统申请到的内存资源。JVM启动的时候会向操作系统申请 -Xms 设置的内存,JVM启动后运行一段时间,如果发现内存空间
不足,会再次向操作系统申请内存。JVM能够获取到的最大堆内存是-Xmx设置的值。
-XX:NewSize 和 -Xmn(-XX:MaxNewSize):指定JVM启动时分配的新生代内存和新生代最大内存。
-XX:SurvivorRatio:设置新生代中1个Eden区与1个Survivor区的大小比值。在hotspot中,新生代 = 1个Eden + 2个Survivor。如果新生代内存是
10M,SurvivorRatio=8,那么Eden区占8M,2个Survivor区各占1M。
-XX:NewRatio:指定老年代/新生代的堆内存比例。在hotspot虚拟机中,堆内存 = 新生代 + 老年代。如果-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆内存的1/5。在设置了-XX:MaxNewSize的情况下,-XX:NewRatio的值会被忽略,老年代的内存=堆内存
- 新生代内存。老年代的最大内存 = 堆内存 - 新生代 最大内存。
-XX:OldSize:设置JVM启动分配的老年代内存大小,类似于新生代内存的初始大小-XX:NewSize。
-XX:PermSize 和 -XX:MaxPermSize:指定JVM中的永久代(方法区)的大小。可以看到:永久代不属于堆内存,堆内存只包含新生代和老年代。
可以发现:堆内存、新生代内存、老年代内存、永久代内存,都有一个初始内存,还有一个最大内存。下面以老年代的初始内存和最大内存为例,看下内存变化的效果,其他的应该类似。测试代码如下:
public class TurnedTest
private static List list = new ArrayList();
public static void main(String[] args)
int a = 0;
while (true)
list.add("demo");
}显然这个程序存在内存泄露,最终会占满整个堆内存,抛出OOM。为了看清楚这个演变的过程,我们在while循环中添加一个断点,设置breakpoint properties中的"hit count"为100000,以debug模式运行上面的程序,然后使用jmap观察内存占用情况。
tenured generation:
capacity = .0MB)
= 0 (0.0MB)
tenured generation:
capacity = .0MB)
26.45% used
tenured generation:
capacity = .0MB)
84.73% used
tenured generation:
capacity =
80.6% used
可以发现老年代内存从最开始的60M,扩大到最大&#M。}

我要回帖

更多关于 java 虚拟机内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信