Matlab的jave内存不足处理方法

上传人:jin****ng 文档编号:110346168 上传时间:2022-06-18 格式:DOC 页数:12 大小:89KB
返回 下载 相关 举报
Matlab的jave内存不足处理方法_第1页
第1页 / 共12页
Matlab的jave内存不足处理方法_第2页
第2页 / 共12页
Matlab的jave内存不足处理方法_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JAVA_OPTS各参数的含意及配置2010-07-09 09:12:03|分类:linux |标签:|字号大中小订阅Xms Xmx XX:PermSize XX:MaxPermSize 1. 各个参数的含义什么? 我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。堆(Heap)和非堆(No n-heap)内存按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类 实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在 JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要 管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留 给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理 或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字 段和方法数据)以及方法和构造方法的代码都在非堆内存中。堆内存分配JVM初始分配的内存由-Xms指定,默认是物理内存的1/64; JVM最大分配 的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM 就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直 至到-Xms的最小限制 因此服务器一般设置-Xms -Xmx相等以避免在每次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以上 的处理器就不会有限制了。2.为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后tomcat 可以启动,而有些机器无法启动? 通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和 非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说 设置 VM 参数导致程序无法启动主要有以下几种原因:1)参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于 -XX:MaxPermSize; 2) -Xmx的值和-XX:MaxPermSize的总和超过了 JVM内存的最大限制,比如当 前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需 要说明一点的是,如果你的内存是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 服务器中间件有效,以“java -cp *.jar test.Main”方式运行的不会去读取JAVA_OPTS.2、如果在运行 java 类,需要设置 Heap Size 的话,需要如下方式:java -Xmx2048m -jar test.jar或者 3、如果是在Unix或者Aix服务器上,可以直接写下如下语句export JAVA_OPTS=-Xmx1024m -Djava.awt.headless=truejava $JAVA_OPTS -cp douglas.jar com.douglas.Main 或者 vi test.sh 文件,写下:#!/bin/sh classpath=./douglas.jar4、对于非Java语言(C+)调用Java代码,最好的方式是提供给操作员设置的页面, 在申明JavaVM时,将JavaOPTS数值放置至JavaVM中。对于 JVM 设置,可以查考如下配置 example:# Memory configuration JAVA_OPTS=-server JAVA_OPTS=$JAVA_OPTS -Xms1280mJAVA_OPTS=$JAVA_OPTS -Xmx1280mJAVA_OPTS=$JAVA_OPTS -XX:NewSize=640mJAVA_OPTS=$JAVA_OPTS -XX:MaxNewSize=640m JAVA_OPTS=$JAVA_OPTS -XX:SurvivorRatio=5JAVA_OPTS=$JAVA_OPTS -XX:TargetSurvivorRatio=90 JAVA_OPTS=$JAVA_OPTS -XX:MaxTenuringThreshold=12 JAVA_OPTS=$JAVA_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:+UseParNewGCJAVA_OPTS=$JAVA_OPTS -XX:PermSize=64m JAVA_OPTS=$JAVA_OPTS -XX:MaxPermSize=64mJAVA_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:+PrintCompilationJAVA_OPTS=$JAVA_OPTS -XX:CodeCacheMinimumFreeSpace=2M JAVA_OPTS=$JAVA_OPTS -XX:ReservedCodeCacheSize=64MJAVA_OPTS=$JAVA_OPTS -XX:CompileCommandFile=/my/portal/bin/hotspot_compiler# Enable JMX Remote MonitoringJAVA_OPTS=$JAVA_OPTS -Dcom.sun.management.jmxremoteJAVA_OPTS=$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9000 JAVA_OPTS=$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=falseJAVA_OPTS=$JAVA_OPTS-Dcom.sun.management.jmxremote.password.file=/my/portal/bin/jmxremote.passw ordJAVA_OPTS=$JAVA_OPTS-Dcom.sun.management.jmxremote.access.file=/my/portal/bin/jmxremote.access# turn on some debug for GC only print the distribution when doing tuning JAVA_OPTS=$JAVA_OPTS -verbose:gcJAVA_OPTS=$JAVA_OPTS -XX:+PrintGCTimeStampsJAVA_OPTS=$JAVA_OPTS -XX:+PrintGCDetails#JAVA_OPTS=$JAVA_OPTS -XX:+PrintTenuringDistributionJAVA_OPTS=$JAVA_OPTS -Xloggc:/my/portal/logs/portal/gc.log# Enable remote debugging portJAVA_OPTS=$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=nJAVA 参数设置我 tomcat 的设置是-Xms1200m-Xmx1500m-XX:MaxNewSize=256m -XX:PermSize=64m-XX:MaxPermSize=128m 这样设置有问题吗,怎么老出现内存溢出的错误,我来帮他解答 输入内容已经达到长度限制还能输入 9999 字插入图片删除图片插入地图删除 地图插入视频视频地图回答即可得 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内存环境下java 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=384mCATALINA_OPTS=-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m-XX:NewSize=192m -XX:MaxNewSize=384mLinux:在孑bin 目录下的 catalina.sh添加: JAVA_OPTS=-Xms512m -Xmx1024m要加“m”说明是MB,否则就是KB 了,在启动tomcat时会 报内存不足。-Xms:初始值-Xmx:最大值-Xm n:最小值Windows在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m如果用startup.bat启动tomcatQK设置生效.够成功的分配200M内存.但是如果不是执行 startup.bat 启动 tomcat 而是利用 windows 的系统服务启动 tomcat服务,上面的设置就不生效了,就是说 set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配 200M 内存就 OOM 了.windows服务执行的是bintomcat.exe他读取注册表中的值,而不是catalina.bat 的设置.解决办法:修改注册表 HKEY_LOCAL_MACHINESOFTWAREApache SoftwareFoundationTomcat Service 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的连接指向mysql,打包放到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)是物理内 存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx 等选项可进行设置。Heap size 的大小是 Young Gen era tion 和 Te nured Gen erai on 之和。提示:在JVM中如果98%的时间是用于GC且可用的Heap size不足2%的时候 将抛出此异常信息。提示:Heap Size最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx 选项设置为相同,而-Xmn为1/4的-Xmx值。解决方法:手动设置 Heap size修 改 TOMCAT_HOME/bin/catalina.bat , 在 “ echo Using CATALINA_BASE: $CATALINA_BASE”上面加入以下行:Java 代码set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256mset JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m或修改 catalina.sh在“ echo Us ing CATALINA_BASE: $CATALINA_BASE” 上面加入以下行:JAVA_OPTS=$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m2、其次是: java.lang.OutOfMemoryError: PermGen space原因:PermGe n space的全称是Perma nent Gen era tion space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放 到PermGen space中,它和存放类实例(Instanee)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对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 Usi ng CATALINA_BASE: $CATALINA_BASE” 上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m“echo Usi ng 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:MaxPermSize=512mJAVA_OPTS=$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m另外看到了另外一个帖子,觉得挺好,摘抄如下:分析 java.lang.OutOfMemoryError: PermGen space发现很多人把问题归因于:spr in g,hiber nate,tomcat,因为他们动态产生类,导致 JVM 中的 permanent heap 溢出 。然后解决方法众说纷纭,有人说升级 tomcat 版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨 论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因 呢? tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是 由一个更基础的问题产生。于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN的JVM把内 存分了不同的区,其中一个就是perme nter区用来存放用得非常多的类和类描述。 本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到 现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是 动态加载类到这个区域后,gc根本没办法回收!对于以上两个问题,我的处理是: 在 catalina.bat 的第一行增加:Java 代码set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256mset JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m在 catalina.sh 的第一行增加:Java 代码JAVA_OPTS=-Xms64m-Xmx256m-XX:PermSize=128M-XX:MaxNewSize=256m-XX:MaxPermSize=256mmatlabforjava的实例配置(根据matlab的帮助文件一步步操作,截图(这里看不见)1. 检查Java环境1) 打开运行窗口2) 输入命令:java -version,查看java版本信息3) 输入命令:javac -version,查看javac版本信息。如果在系统环境中, JDK路径不是设置在系统变量path中,而是设置在用户变量Java-home 中,应加上相应路径,输入命令为:JAVA_HOME%/bin/javac -version。4) 以上检查完成后,就可以进行操作,否则重新配置java环境。2. 实例:发布一个矩阵实例,将M-code编写的功能转换成java可用的组件。1) matlab中所做工作(1) 打开 MATLAB Builder JA 产品启动matlab,在matlab的命令行窗口(以下所说命令,除非特指, 均指在matlab的命令行窗口输入的命令)中输入命令:deploytoo 1,打开 java发布工具。检查matlab是否正确指向JDK的工作路径,输入命令: getenv JAVA_HOME,检查所指路径是否正确。(2) 拷贝实例文件拷贝 matlab%/toolbox/javabuilder/Examples/MagicSquareExample 至 U matlab 的工作空 间,把文件名 MagicSquareExample 重命名为 magic_square。(3)测试要发布的M-file文件在matlab中导入在D:/javabuilder_examples/magic_square/MagicDemoComp 下的 makesqr.m 文件。为了确保能找到对应的文件,在matlab中要设置对应的工作搜索 路径,在 “ file/setpath ” 设置工作搜索路径 D:/javabuilder_examples/magic_square/MagicDemoComp,点击“ save ”。 makesqr.m文件内容如下:function y = makesqr(x)%MAKESQR Magic square of size x.% Y = MAKESQR(X) returns a magic square of size x.% This file is used as an example for the MATLAB% Builder for Java Language product.% Copyright 2001-2006 The MathWorks, Inc.y = magic(x);测试m文件是否正常运行,输入命令:makesqr(5),运行结果。(4)创建Java组件a.创建新的发布项目。点击发布工具箱的“新建”按钮。在打开的窗口中,左边选择MATLAB Builder JA,右边选择Java Package o 选择文件保存路径为 D:/MyProgram/workspace/matlab/magic_square,输 入文件名 magicsquare,点击 ok 按钮。b. 重命名类名MATLAB Builder JA产品根据所建的项目名称自动给创建的类赋名,象 目前创建后的项目magicsquare下的类,名称应为:magicsquareclass, 重命名为magic。c. 确认发布工具面板上的选项Generate Verbose Output已被选择。d. magicsquare项目中添加m-file文件。先选择当前目录至makesqr.m文 件所在的路径,在右边文件显示窗口中拖动对应的文件至发布工具窗 口,系统自动将该文件放至对应类中,点击保存按钮。e. 构建项目,创建初始的java包。在发布工具面板上点击构建项目按钮,系统开始构建项目,其操作结 果,警告等信息会显示在output窗口上。构建后系统会在项目路径下生 成两个文件夹: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里的文件打包起来。2) java平台下所做工作(1)搜集所需的文件,包括:a. MCR Installerb. Javadoc documentationc. readme.txt filed. com.ma thworks .to olbox.javabuilder(%matlab%/toolbox/javabuilder/jar/javabuilder.jar)e. MATLAB Builder JA 创建的 magicsquare.jar(2) 在java开发平台测试组件新建一个java项目magic,在src目录下新建一个java程序 Getmagic.java,实例文件/javabuilder_examples/magic_square/MagicDemoJavaApp 中已经提供源 代码。Getmagic.java的源代码见附录1。在magic项目中导入所需的两个jar包,一个是之前用 MATLAB Builder JA 仓 U 建 的 magicsquare.jar, 个 是 javabuilder.jar, %matlab%/toolbox/javabuilder/jar/javabuilder.jar。(3) 配置MyEclipse的运行环境。选择Getmagic.java程序,右键选择 run-open run dialog,左边选择 Application/file,右边 需要配置的选项卡有Main、Arguments、Enviroment。Main选项卡:选择相应的程序,和main函数所在的类,点击apply按钮。Arguments选项卡:在Program Arguments中输入参数,如本例输入: 5,点击apply按钮。Enviroment 选项卡:设置 matlab 的动态链接库的路 径, matlab%/bin/win32。具体操作:选择Enviroment选项卡,点 击 new 按钮,新建变量 path , 变量值为 D:/MyProgram/matlab/bin/win32。点击 Apply 按钮应用。(此步骤 可以在系统的环境变量中配置)设置好参数后,点击run按钮,即可运行程序。3)用mcrroot替换matlabroot再次测试程序。执行好这一步后就可以直接 使用mcr运行程序,即使没有安装matlab也可以使用。(1) 安装mcr。运行之前Matlab的发布工具面板打包的可执行程 序 magicsquare_pkg.exe, 解压出 4 个文件:_install.bat, magicsquare.jar , readme.txt , MCRInstaller.exe 。 运 彳亍 MCRInstaller.exe , 安装至指定目录,假设为 D:/MyProgram/matlab/mrc/v78。安装过程中可能会出现以下错误,点击ok按钮继续安装即可。(2) 打开Enviroment编辑path变量,选择之前的path变量,点击 Edit 按钮。把 path 的 Value 值改 : D:/MyProgram/matlab/mrc/v78/runtime/win32。附件1./* getmagic.java* This file is used as an example for the MATLAB* Builder JA product.* Copyright 2001-2006 The MathWorks, Inc.*/ /* Necessary package imports */import com.mathworks.toolbox.javabuilder.*; import magicsquare.*;/* getmagic class computes a magic square of order N. The* positive integer N is passed on the command line. */public class Getmagicpublic static voidMWNumericArraynObject resultmain(String args)=null;=null;magic theMagic = null; instance */* Stores input value */* Stores the result */* Stores magic classtry/* If no input, exit */if (args.length = 0)Systemut.println(Error:must input apositive integer);return;/* Convert and print input value*/n=newMWNumericArray(Double.valueOf (args0),MWClassID.DOUB LE);Systenuut .println(Magic square of order + n.toString();/* Create new magic object */ theMagic =new magic();/* Compute magic square and print result */ result = theMagic.makesqr(1, n);Systenuut .println(resultO);catch (Exception e)Systenuut .println(Exception:+e.toString();finally /* Free native resources */MWArrayiisposeArray(n); MWArraydisposeArray (result);if (theMagic != null)theMagic.dispose();
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!