内存溢出问题java.lang.OutOfMemoryError: Java heap space

我的java虚拟机默认的是64m,堆内存,在java监控器中可以看到超过就溢出了。(java监控器的位置C:\Program Files\Java\jdk1.6.0_03\bin\jconsole.exe)

当程序运行,出行OutOfMemoryError的错误时候,一般是表示程序运行时候,内存分配不足。

堆(Heap)和非堆(Non-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以上的处理器就不会有限制了

修改配置文件一、加大JVM的非堆内存
打开 myeclipse.ini
MyEclipse8.5 myeclipse.ini里的内容:
-startup
../Common/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
--launcher.library
../Common/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-install
D:/Program Files/Genuitec/MyEclipse 8.5
-vm
D:/Program Files/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client/jvm.dll
-configuration
configuration
-vmargs
-Xmx512m
-XX:MaxPermSize=512m //原来是256我改为512
-XX:ReservedCodeCacheSize=64m
把下面的那个 -XX:MaxPermSize 调大,比如 -XX:MaxPermSize=512M.

几乎每次 eclipse 卡到当都是因为这个 非堆内存 不足造成的,把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小
注意:XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小!

二、在程序运行时加大堆内存

点击菜单‘run->Debug Configrations’,选择(x)=Argument标签页下的vm arguments框里
输入 -Xmx512m, 保存运行。或者根据自己的程序需要修改这个最大值。


你可能感兴趣的:(java,虚拟机,memory,监控器)