Java虚拟机模型区溢出的处理方式

来源:互联网 发布:大连光洋 知乎 编辑:程序博客网 时间:2024/05/16 19:08

1、堆溢出
采用内存映像工具(如Eclipse Momery Analyzer)对dump出来的堆存储快照进行分析,重点hi确认内存中的对象是否是必须的,先分清楚是泄露还是溢出。
若是泄露,进一步通过工具查看泄漏对象到GC Roots的引用链,观察泄漏对象是通过怎样的路径与GC roots相关联并导致垃圾收集器无法自动回收他们,掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置。
若不存在泄漏,应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长,持有状态时间过长的情况,尝试减少程序区运行期的内存消耗。
2、虚拟机栈和本地方法栈溢出
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError。如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError。
这两种情况最基本的原因还是栈空间无法继续分配。
建立过多线程导致的内存溢出,在不能减少线程数或者更换64位虚拟机的情况下,就只能通过减少最大堆和减少栈容量来换取更多的线程。
3、运行时常量池溢出
向常量池添加内容时,使用String.intern()方法,如果常量池已经存在一个等于此对象的字符串,则返回代表这个字符串的对象,否则,将该String对象包含的字符串存到常量池中,并且返回此String对象的引用。
4、方法区溢出
方法区用于存放class的相关信息,增加的类越多,就需要越大的方法区来保证动态生成的class可以加载内存,在经常动态生成大量class的应用中,需要特别注意类的回收状况。

0 0
原创粉丝点击