JVM内存的设置(解决eclipse下outofmemory问题)⼀、JVM内存的设置的原理
默认的java虚拟机的⼤⼩⽐较⼩,在对⼤数据进⾏处理时java就会报错:java.lang.OutOfMemoryError。
设置jvm内存的⽅法,对于单独的.class,可以⽤下⾯的⽅法对Test运⾏时的jvm内存进⾏设置。
java -Xms64m -Xmx256m Test
-Xms是设置内存初始化的⼤⼩
-Xmx是设置最⼤能够使⽤内存的⼤⼩(最好不要超过物理内存⼤⼩)
⼆、JVM内存分配设置
1. JVM内存分配设置的参数有四个:
-Xmx    Java Heap最⼤值,默认值为物理内存的1/4,最佳设值应该视物理内存⼤⼩及计算机内其他内存开销⽽定;
-Xms    Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn    Java Heap Young区⼤⼩,不熟悉最好保留默认值;
-Xss    每个线程的Stack⼤⼩,不熟悉最好保留默认值;
2. 如何设置JVM的内存分配:
(1)当在命令提⽰符下启动并使⽤JVM时(只对当前运⾏的类Test⽣效):
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test
(2)当在集成开发环境下(如eclipse)启动并使⽤JVM时:
a. 在eclipse根⽬录下打开eclipse.ini,默认内容为(这⾥设置的是运⾏当前开发⼯具的JVM内存分配):
-vmargs
-Xms40m
-Xmx256m
-
vmargs表⽰以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置⾮堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
此处设置的参数值可以通过以下配置在开发⼯具的状态栏显⽰:
在eclipse根⽬录下创建⽂件options,⽂件内容为:lipse.ui/perf/showHeapStatus=true
修改eclipse根⽬录下的eclipse.ini⽂件,在开头处添加如下内容:
-debug
options
-vm
<
重新启动eclipse,就可以看到下⽅状态条多了JVM信息。
b. 打开eclipse-窗⼝-⾸选项-Java-已安装的JRE(对在当前开发环境中运⾏的java程序皆⽣效)
eclipse怎么打开已有的java文件编辑当前使⽤的JRE,在缺省VM参数中输⼊:-Xmx128m -Xms64m -Xmn32m -Xss16m
c. 打开eclipse-运⾏-运⾏-Java应⽤程序(只对所设置的java类⽣效)
选定需设置内存分配的类-⾃变量,在VM⾃变量中输⼊:-Xmx128m -Xms64m -Xmn32m -Xss16m
注:如果在同⼀开发环境中同时进⾏了b和c设置,则b设置⽣效,c设置⽆效,如:
开发环境的设置为:-Xmx256m,⽽类Test的设置为:-Xmx128m -Xms64m,则运⾏Test时⽣效的设置为:
-Xmx256m -Xms64m
(3)当在服务器环境下(如Tomcat)启动并使⽤JVM时(对当前服务器环境下所以Java程序⽣效):
a. 设置环境变量:
变量名:CATALINA_OPTS
变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m
b. 打开Tomcat根⽬录下的bin⽂件夹,编辑catalina.bat,在set JAVA_OPTS=%JAVA_OPTS%....这句
之后加上:set
JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m
c、若没有catalina.bat,只有,;则可以在启动 后右键配置--Java--java option 下⾯输⼊:
-Xmx256m
-Xms64m
也可以到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service
Manager\Tomcat6\Parameters\JavaOptions
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 6.0"
-dorsed.dirs="C:\ApacheGroup\Tomcat 6.0\common\endorsed"
-Xrs
加⼊
-Xms300m
-Xmx350m
重起tomcat服务,设置⽣效
三、查看JVM内存信息
关于maxMemory(),freeMemory()和totalMemory():
maxMemory()为JVM的最⼤可⽤内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能⾼于计算机物理内存;
totalMemory()为当前JVM占⽤的内存总数,其值相当于当前JVM已使⽤的内存及freeMemory()的总和,会随着JVM使⽤内存的增加⽽增加;
freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占⽤物理内存使⽤,所以freeMemory()的值⼀般情况下都很⼩,⽽ JVM实际可⽤内存并不等于freeMemory(),⽽应该等于maxMemory()-totalMemory()+freeMemory()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。