JAVA 堆设置

第四节

堆已经讲得差不多啦,这章我们以一个例子来说说如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码:


        代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点:

-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError,elipse中的设置方法我们在第一章讲过了,这里不多说啦。-Xms10m,意思就是堆的最小内存为10m。同理-Xmx10m的意思就是最大内存也为10m。这两个都是设置为10m,那么堆的大小就是10m。而-XX:+HeapDumpOnOutOfMemoryError指的是当发生内存溢出的时候会将当前的内存使用情况生成一个快照保存起来,但需要eclipse下载一个MAT的插件,下载方式度娘到处都是。

使用刚刚设置的参数启动程序,稍等一小会就会出现以下错误:

显示出堆溢出错误,并且生成了一个叫做java_pid4792.hprof的文件,我们刷新项目便可以看到该文件,双击打开,需要一段的加载时间。


        首先可以看到的是一个饼状图,占用部分最大的便是发生溢出错误的部分,我们接着往下看 :

我们这里看看画红线的部分,这里列出一些存活的大对象,在溢出的时候一般先怀疑大对象,我们点进去:


        这里列出占用内存最大的几个对象,很显然,第一个很可疑,占用率达到了94.64%!继续跟进:

发现都是test对象,因此排查的时候可以从这个方面下手。接着我们右键该对象选择Path To GC Root(在引用链上的路径),再选择exclue all phantom/weak/soft etc. reference ,结果如图:

可以看到他是被List引用了,因此一直在引用链上,导致无法被回收掉,也就出现了内存溢出。

本文只讲了MAT的一个最基本的用途,指出排查思路,感兴趣的小伙伴可以结合工作上的案例自己深入的去了解其更多的用途。

关于堆中各个区域的设置先不在这里讲,一步一步来,等道路明朗了,问题也就都迎刃而解了!

JAVA 堆设置的更多相关文章

  1. 从 Java 代码到 Java 堆

    本文将为您提供 Java 代码内存使用情况的深入见解,包括将 int 值置入一个 Integer 对象的内存开销.对象委托的成本和不同集合类型的内存效率.您将了解到如何确定应用程序中的哪些位置效率低下 ...

  2. Java堆内存的十个要点

    Java中的堆空间是什么? 当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或 ...

  3. Java堆、栈和常量池以及相关String的详细讲解(经典中的经典) (转)

    原文链接 : http://www.cnblogs.com/xiohao/p/4296088.html 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的 ...

  4. Java堆、栈和常量池以及相关String的详细讲解

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  5. Java堆

    1. Java堆的内存是由操作系统分配给JVM的内存部分. 2. Java的对象是在堆中创建 3. Java堆空间为了垃圾回收分为三个区域或代,叫做新代,年老代和永久代.在Hotspot JVM中永久 ...

  6. Java堆内存

    Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Yo ...

  7. google-perftools 分析JAVA 堆外内存

    google-perftools 分析JAVA 堆外内存 分类: j2se2011-08-25 21:48 3358人阅读 评论(4) 收藏 举报 javahbasehtml工具os 原文转自:htt ...

  8. (2)java堆内存

    java堆内存结构图 [名词解释]--->eden,so,s1通称为新生代对象储区--->tenured称为老年代对象存储区--->s0和s1也称为from和to区域,是两块大小相等 ...

  9. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

随机推荐

  1. SharePoint 2010 用Event Receiver将文件夹自动变成approved状态 (2)

    接上篇,先贴ItemUpdated的代码: base.ItemUpdated(properties); if (properties.ListItem.FileSystemObjectType != ...

  2. 一个月AS2.0总结。

    来这家公司一个月了,从最初学习它的木块,到流程,到组件,到改动,到自己做. 感觉好快. 1.AS2.0确实比較3.0差距太大.假设不是公司必须使用2.0,我是真不想使用. 2.代码重用性差.相同的代码 ...

  3. C# 获取网站的 IIS 站点名称 ,获取站点当前连接数

    System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); System.Management.ManagementObj ...

  4. JqueryUI-2

    本文在于巩固基础 jQuery UI Widgets jQuery UI Widgets控件-Accordion <!DOCTYPE html> <html> <head ...

  5. css系列教程--overflow min/maxheight content

    outline:这只轮廓样式,与border类似.写法参考border. overflow/overflow-x/overflow-y:visible/hidden/scroll/auto/no-di ...

  6. UVA 1343 The Rotation Game

    题意: 给出图,往A-H方向旋转,使中间8个格子数字相同.要求旋转次数最少,操作序列字典序尽量小. 分析: 用一维数组存24个方格.二维数组代表每个方向对应的7个方格.IDA*剪枝是当8-8个方格中重 ...

  7. Java内部类总结

    内部类是一种编译器现象,与虚拟机无关.编译器将会把内部类翻译成用美元符号$分隔外部类名与内部类名的常规类文件,而虚拟机对此一无所知.编译器为了引用外部类,生成了一个附加的实例域this$0 为什么要用 ...

  8. Linux系统学习笔记:文件描述符标志

    文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...

  9. mysql 更新 语句中 的 safe_mode

    在mysql5中,可以设置safe mode,比如在一个更新语句中UPDATE table_name SET bDeleted=0;执行时会错误,报:You are using safe update ...

  10. .offset()与.position()区别

    jQuery中有两个获取元素位置的方法offset()和position(),两者的定义如下:   offset():获取匹配元素在当前视口的相对偏移.返回的对象包含两个整形属性:top 和 left ...