步骤:
1、选中已经写好的项目
2、Run->Debug configurations->Java Application 双击
3、Arguments->VM arguments
4、在VM arguments 里面就可以对虚拟机的内存参数进行设置
5、设置完成后,Apply->Debug
6、过程结束
设置页面如图:
参数解释:
1,堆是存储对象实例的,创建的对象都是在堆中进行内存分配的;设置堆的大小:-Xms20M(最小值),-Xmx20M(最大值) , 其中-Xmn设置年轻代大小。
2,栈是存储局部变量,操作栈,动态链接,方法出口(都在栈桢中) 的地方,调用方法时,会创建栈桢;设置栈的大小:-Xss128K。
3,方法区是存放Class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。此外运行时常量池是属于方法区的,即存放常量,静态常量等;设置方法区大小,-XX:PermSize=10M和-XX:MaxPermSize=10M。
4,本地直接内存;设置本地直接内存大小:-XX:MaxDirectMemorySize(默认与-Xmx的值一样)。
5,通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析。
Java堆溢出
java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。
代码:
package Java;
import java.util.ArrayList;
import java.util.List;
/**
* VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
* @author xc
*/
public class HeapOOM
{
static class OOMObject
{
public static void main(String[] args)
{
List<OOMObject> list = new ArrayList<OOMObject>();
while(true)
{
list.add(new OOMObject());
}
}
}
}
上述参数限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析。
运行结果:
Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError"会进一步提示"Java heao space".
要解决这个区域的异常,一般的手段是先通过内存映像分析工具(如Eclipse Memory-Analyzer)对Dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
如果内存泄漏,可进一步通过工具查看泄露对象到GC Rootsd额引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息及GC Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置。
如果不存在泄漏,换句话说,就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xms和-Xmx),与机器物理内存对比看是否还可以调大,从代码检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。