1、JAVA_OPTS 各参数的含意及配置 2010-07-09 09:12:03| 分类: linux | 标签: |字号大中小 订阅 Xms Xmx XX:PermSize XX:MaxPermSize1. 各个参数的含义什么?我们首先了解一下 JVM 内存管理的机制,然后再解释每个参数代表的含义。堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在 JVM 中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM 主要管理两种类型的内
2、存:堆和非堆。简单来说堆就是 Java 代码可及的内存,是留给开发人员使用的;非堆就是 JVM 留给自己用的,所以方法区、JVM 内部处理或优化所需的内存(如 JIT 编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。堆内存分配JVM 初始分配的内存由-Xms 指定,默认是物理内存的 1/64;JVM 最大分配的内存由-Xmx 指定,默认是物理内存的 1/4。默认空余堆内存小于 40%时,JVM 就会增大堆直到-Xmx 的最大限制;空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。因此服务器一般设置-Xms、-Xmx 相
3、等以避免在每次 GC 后调整堆的大小。非堆内存分配JVM 使用-XX:PermSize 设置非堆内存初始值,默认是物理内存的 1/64;由XX:MaxPermSize 设置最大非堆内存的大小,默认是物理内存的 1/4。JVM 内存限制(最大值)首先 JVM 内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM 内存的最大值跟操作系统有很大的关系。简单的说就 32 位处理器虽然可控内存空间有 4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说 Windows 系统下为 1.5G-2G,Linux 系统下为 2G-3G),而64bit 以上的处理器就不会有限制
4、了。 2. 为什么有的机器我将 -Xmx 和-XX:MaxPermSize 都设置为 512M 之后 tomcat可以启动,而有些机器无法启动?通过上面对 JVM 内存管理的介绍我们已经了解到 JVM 内存包含两种:堆内存和非堆内存,另外 JVM 最大内存首先取决于实际的物理内存和操作系统。所以说设置 VM 参数导致程序无法启动主要有以下几种原因:1) 参数中-Xms 的值大于-Xmx,或者-XX:PermSize 的值大于-XX:MaxPermSize;2) -Xmx 的值和-XX:MaxPermSize 的总和超过了 JVM 内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存
5、等等。说到实际物理内存这里需要说明一点的是,如果你的内存是 1024MB,但实际系统中用到的并不可能是 1024MB,因为有一部分被硬件占用了。谈 JAVA_OPTS 环境变量不起作用2009-09-23 17:29 最近在处理运行一个 java 应用时,老是出现java.lang.OutOfMemoryError: Java heap space.即时我在环境变量里设置了JAVA_OPTS -Xmx2048m 还是报错。 javaeye 上搜索了一番,发现很多人都有这个疑问。经过 Team Leader 的指导,发现: 1、JAVA_OPTS 只对 tomcat/weblogic 等 Web
6、 服务器中间件有效,以“java -cp *.jar test.Main”方式运行的不会去读取 JAVA_OPTS. 2、如果在运行 java 类,需要设置 Heap Size 的话,需要如下方式: java -Xmx2048m -jar test.jar 或者 java -Xmx1024m -cp douglas.jar com.douglas.Main 3、如果是在 Unix 或者 Aix 服务器上,可以直接写下如下语句 export JAVA_OPTS=-Xmx1024m -Djava.awt.headless=true java $JAVA_OPTS -cp douglas.jar c
7、om.douglas.Main 或者 vi test.sh 文件,写下: #!/bin/sh classpath=./douglas.jar /usr/java5/bin/java -Xmx1024M -cp $classpath com.douglas.Main 4、对于非 Java 语言(C+)调用 Java 代码,最好的方式是提供给操作员设置的页面,在申明 JavaVM 时,将 JavaOPTS 数值放置至 JavaVM 中。 对于 JVM 设置,可以查考如下配置 example: # Memory configuration JAVA_OPTS=“-server“ JAVA_OPTS=
8、“$JAVA_OPTS -Xms1280m“ JAVA_OPTS=“$JAVA_OPTS -Xmx1280m“ JAVA_OPTS=“$JAVA_OPTS -XX:NewSize=640m“ JAVA_OPTS=“$JAVA_OPTS -XX:MaxNewSize=640m“ JAVA_OPTS=“$JAVA_OPTS -XX:SurvivorRatio=5“ JAVA_OPTS=“$JAVA_OPTS -XX:TargetSurvivorRatio=90“ JAVA_OPTS=“$JAVA_OPTS -XX:MaxTenuringThreshold=12“ JAVA_OPTS=“$JAVA_
9、OPTS -XX:+UseConcMarkSweepGC“ JAVA_OPTS=“$JAVA_OPTS -XX:+CMSIncrementalMode“ JAVA_OPTS=“$JAVA_OPTS -XX:+CMSIncrementalPacing“ JAVA_OPTS=“$JAVA_OPTS -XX:+CMSParallelRemarkEnabled“ JAVA_OPTS=“$JAVA_OPTS -XX:+UseParNewGC“ JAVA_OPTS=“$JAVA_OPTS -XX:PermSize=64m“ JAVA_OPTS=“$JAVA_OPTS -XX:MaxPermSize=64m
10、“ JAVA_OPTS=“$JAVA_OPTS -XX:+UseTLAB“ # Enable class unloading (needed with ConcMarkSweepGC JAVA_OPTS=“$JAVA_OPTS -XX:+CMSClassUnloadingEnabled“ JAVA_OPTS=“$JAVA_OPTS -XX:+CMSPermGenSweepingEnabled“ # debug and memory tweaks to avoid Hotspot Compiler Failure JAVA_OPTS=“$JAVA_OPTS -XX:+PrintCompilati
11、on“ JAVA_OPTS=“$JAVA_OPTS -XX:CodeCacheMinimumFreeSpace=2M“ JAVA_OPTS=“$JAVA_OPTS -XX:ReservedCodeCacheSize=64M“ JAVA_OPTS=“$JAVA_OPTS -XX:CompileCommandFile=/my/portal/bin/hotspot_compiler“ # Enable JMX Remote Monitoring JAVA_OPTS=“$JAVA_OPTS -Dcom.sun.management.jmxremote“ JAVA_OPTS=“$JAVA_OPTS -D
12、com.sun.management.jmxremote.port=9000“ JAVA_OPTS=“$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false“ JAVA_OPTS=“$JAVA_OPTS -Dcom.sun.management.jmxremote.password.file=/my/portal/bin/jmxremote.password“ JAVA_OPTS=“$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=/my/portal/bin/jmxremote.acce
13、ss“ # turn on some debug for GC only print the distribution when doing tuning JAVA_OPTS=“$JAVA_OPTS -verbose:gc“ JAVA_OPTS=“$JAVA_OPTS -XX:+PrintGCTimeStamps“ JAVA_OPTS=“$JAVA_OPTS -XX:+PrintGCDetails“ #JAVA_OPTS=“$JAVA_OPTS -XX:+PrintTenuringDistribution“ JAVA_OPTS=“$JAVA_OPTS -Xloggc:/my/portal/lo
14、gs/portal/gc.log“ # Enable remote debugging port JAVA_OPTS=“$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n“ JAVA 参数设置我 tomcat 的设置是-Xms1200m-Xmx1500m-XX:MaxNewSize=256m-XX:PermSize=64m-XX:MaxPermSize=128m这样设置有问题吗,怎么老出现内存溢出的错误,我来帮他解答 输入内容已经达到长度限制还能输入 9999 字插入图片删除图片插入地
15、图删除地图插入视频视频地图回答即可得 2 分经验值,回答被选为满意回答可同步增加经验值和财富值参考资料:匿名回答提交回答取消 2010-6-23 14:48 满意回答 先试试这个:-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 下面是找了 2 篇文章答案 1设置 Tomcat 启动的初始内存其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的 -Xmn -Xms -Xmx 等选项可进行设置三、实例,以下给出 1G 内存环境下 ja
16、va jvm 的参数设置参考:JAVA_OPTS=“-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true “JAVA_OPTS=“-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m“CATALINA_OPTS=“-server -Xms768m -Xmx768m -XX:PermS
17、ize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m“Linux:在/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 启动
18、 tomcat,OK 设置生效. 够成功的分配 200M 内存.但是如果不是执行 startup.bat 启动 tomcat 而是利用 windows 的系统服务启动tomcat 服务, 上面的设置就不生效了,就是说 set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配 200M 内存就OOM 了.windows 服务执行的是 bintomcat.exe.他读取注册表中的值, 而不是 catalina.bat的设置.解决办法:修改注册表 HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Servi
19、ce ManagerTomcat5ParametersJavaOptions原值为-Dcatalina.home=“C:ApacheGroupTomcat 5.0“-Djava.endorsed.dirs=“C:ApacheGroupTomcat 5.0commonendorsed“-Xrs加入 -Xms300m -Xmx350m 重起 tomcat 服务, 设置生效 答案 2Tomcat 的 JVM 内存溢出问题的解决关键字: tomcat 的 jvm 内存溢出问题的解决 最近在熟悉一个开发了有几年的项目,需要把数据库从 mysql 移植到 oracle,首先把 jdbc 的连接指向 mys
20、ql,打包放到 tomcat 里面,可以跑起来,没有问题,可是当把 jdbc 连接指向 oracle 的时候,tomcat 就连续抛java.lang.OutOfMemoryError 的错误,上网 google 了一下,了解了一下 tomcat的运行机制,也解决了问题,share 出来,以备查。 1、首先是:java.lang.OutOfMemoryError: Java heap space 解释: Heap size 设置 JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置.JVM 在启动的时候会自动设置 Heap size 的值,其初始空间(即-Xms
21、) 是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行设置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。 提示:在 JVM 中如果 98的时间是用于 GC 且可用的 Heap size 不足 2的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的 80,一般的要将-Xms 和-Xmx选项设置为相同,而-Xmn 为 1/4 的-Xmx 值。 解决方法: 手动设置 Heap size 修改 TOMCAT_HOME/bin/ca
22、talina.bat,在“echo “Using CATALINA_BASE: $CATALINA_BASE“”上面加入以下行: Java 代码 set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m 或修改 catalina.sh 在“echo “Using CATALINA_BASE: $CATALINA_BASE“”上面加入以下行: JAVA_OPTS=“$J
23、AVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m“ 2、其次是:java.lang.OutOfMemoryError: PermGen space 原因: PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中,它和存放类实例 (Instance)的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对
24、 PermGen space 进行清理,所以如果你的应用中有很 CLASS 的话, 就很可能出现 PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP 下都用了大量的第三方jar, 其大小超过了 jvm 默认的大小 (4M)那么就会产生此错误信息了。 解决方法: 1. 手动设置 MaxPermSize 大小 修改 TOMCAT_HOME/bin/catalina.bat(Linux 下为 catalina.sh) ,在 Java 代码 “echo “Using CATALINA_BASE: $CATALINA
25、_BASE“”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m “echo “Using CATALINA_BASE: $CATALINA_BASE“”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m catalina.sh 下为: Java 代码 JAVA_OPTS=“$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSi
26、ze=512m“ JAVA_OPTS=“$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m“ 另外看到了另外一个帖子,觉得挺好,摘抄如下: 分析 java.lang.OutOfMemoryError: PermGen space 发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM 中的 permanent heap 溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用 tomcat。还有人怀疑 spring 的问题,在 spring 论坛上讨论很激烈,因
27、为 spring 在 AOP 时使用 CBLIB 会动态产生很多类。 但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat 在 Q测试 m 文件是否正常运行,输入命令:makesqr(5),运行结果。(4)创建 Java 组件a.创建新的发布项目。点击发布工具箱的“新建”按钮。在打开的窗口中,左边选择 MATLAB Builder JA,右边选择 Java Package。选择文件保存路径为D:/MyProgram/workspace/matlab/magic_square,输入文件名magicsquare,点击 ok 按钮。b.重命名类名MATLAB Bui
28、lder JA 产品根据所建的项目名称自动给创建的类赋名,象目前创建后的项目 magicsquare 下的类,名称应为:magicsquareclass,重命名为 magic。c.确认发布工具面板上的选项 Generate Verbose Output 已被选择。d.magicsquare 项目中添加 m-file 文件。先选择当前目录至 makesqr.m文件所在的路径,在右边文件显示窗口中拖动对应的文件至发布工具窗口,系统自动将该文件放至对应类中,点击保存按钮。e.构建项目,创建初始的 java 包。在发布工具面板上点击构建项目按钮 ,系统开始构建项目,其操作结果,警告等信息会显示在 ou
29、tput 窗口上。构建后系统会在项目路径下生成两个文件夹:src 和 distrib,src 包含 java 源文件 magic.class,distrib包含打包文件 magicsquare.jar。构建路径及构建内容的选择可以在Deployment Project Settings dialog box 设置。(5)选择打包文件点击发布工具面板上的 settings 按钮,打开设置页面。在左边窗口选择“Packaging”,右边窗口按表格指示操作,最后点击 ok 按钮。要打包的文件 操作MCR Installer 选中 Include MCR.选项.Auto-generated Javadoc documentation在 Additional Files 窗口选择项目的/src/doc ,点击Add 按钮,添加到右边栏上。readme.txt 在 Additional Files 窗口选择项目的/distrib 的readme.txt,点击 Add 按钮,添加到右边栏上。(6)运行打包程序。点击发布工具面板上的打包按钮,对项目进行打包。然后用压缩工具把 distrib 里的文件打包起来。