JVM 的内存溢出/不足/OutOfMemoryError/垃圾收集恶性循环是需要解决,又是屡见不鲜的问题。

建议阅读官方的 Troubleshooting Guide for Java SE 6 with HotSpot VM > Troubleshooting Memory Leaks

  • 首先清楚判定问题 - GC 日志是判断内存问题最准确的方法,因为 Java 的内存问题的本质是 GC 问题

    • Heap 堆不足溢出
    • Stack 堆栈不足溢出
    • Perm 堆不足溢出 - Java 8 取消了 Perm
    • 垃圾收集的恶性循环 - 注意:这几乎是最最常见的现象
  • Stack 堆栈不足溢出 - 错误是 StackOverFlowError

JVM 会打印出来具体的 Stack Trace

如果 Stack 比较大但是没有递归,那么调大 -Xss ( Server 默认 1024K )

如果 Stack Trace 显示递归,那么修改代码

  • Perm 堆不足溢出 - OutOfMemoryError 带着 PermGen space

调大 -XX:MaxPermSize,比如 768m

  • Heap 堆不足溢出 - OutOfMemoryError 带着 Heap Space

解决:调大 -Xmx,如果够大了需要 DEBUG - 参照下面 DEBUG HEAP

  • 垃圾收集的恶性循环 - 注意:这几乎是最最常见的现象

现象:

JVM 不相应,内存基本耗光,分析 GC 日志,会看到 花了很久做 FullGC ,释放了一点内存,很快又需要FullGC,比如 10 秒做了FullGC,1 秒后又需要FullGC 然后 10 秒完成 FullGC, 反复如此。

解决:调大 -Xmx,或者 DEBUG - 参照下面 DEBUG HEAP

  • DEBUG HEAP - 建议抓到 heapdump, 然后分析

    • 抓取 heapdump - 很多方法,但是常用如下 (注意针对非 IBM Java)

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

--配置参数内存溢出时候自动抓取,注意往往内存问题表现为垃圾收集恶性循环,那就产生不出来。

jmap.exe -dump:format=b,file=HeapDump.hprof <pid>

--命令抓取

    • 分析 heapdump

建议 Eclipse Memory Analyzer (http://www.eclipse.org/mat/)

Java Performance - 如何调查解决内存问题的更多相关文章

  1. Java Performance - 如何调查解决 CPU 问题

    随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题:但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问 ...

  2. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...

  3. 详解java中CAS机制所导致的问题以及解决——内存顺序冲突

    [CAS机制] 指的是CompareAndSwap或CompareAndSet,是一个原子操作,实现此机制的原子类记录着当前值的在内存中存储的偏移地址,将内存中的真实值V与旧的预期值A做比较,如果不一 ...

  4. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

  5. Android 如何有效的解决内存泄漏的问题

    前言:最近在研究Handler的知识,其中涉及到一个问题,如何避免Handler带来的内存溢出问题.在网上找了很多资料,有很多都是互相抄的,没有实际的作用. 本文的内存泄漏检测工具是:LeakCana ...

  6. Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

    Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...

  7. android解决内存溢出的问题(没有从根本上解决)

    Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完 ...

  8. PHPExcel解决内存占用过大问题-dw 查找memoryCacheSize把1M改为2048M

    http://blog.sina.com.cn/s/blog_4ec7952d0101fcrd.html PHPExcel解决内存占用过大问题-设置单元格对象缓存 PHPExcel是一个很强大的处理E ...

  9. Java高并发如何解决

    Java高并发如何解决 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧 ...

随机推荐

  1. 使用存储过程来动态调用数据(SELECT)

    USE [MyTestDb] GO /****** Object: StoredProcedure [dbo].[PROC_GetChannelList] Script Date: 04/09/201 ...

  2. C++的try_catch异常

    http://blog.sina.com.cn/s/blog_a9303fd901018ost.html 大部分内容转自:http://blog.csdn.net/codestinity/articl ...

  3. php操作redis常用方法源代码

    1,connect 描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: <?php $redis ...

  4. Java程序中调用Python脚本的方法

    在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...

  5. word2007

      word2007   word2007图标   word2007边框和底纹   word2007扫描图片   word2007剪贴画   word2007图片   word2007页面视图   w ...

  6. 一维条码打印的C#实现(Code128)

    1.CODE128基础知识 CODE128有三个版本: CODE128A: 标准数字和字母, 控制符, 特殊字符 CODE128B: 标准数字和字母, 小写字母, 特殊字符 CODE128C: [00 ...

  7. <转>“人脉投资”的10条建议

    谁都知道人脉很重要,所以有些人非常勤奋的“做人脉”,他们往往会这样做—— 积极的参与各类线下活动,逢人就换名片.加微信. 见到名人或者重要人物必合影,而且他们还会掏出手机来给你看. 逢年过节,给所有他 ...

  8. 服务器端验证--验证框架验证required.

    struts2表单验证里field-validator type值一共可以取哪些?都什么含义? int 整数:double 实数:date 日期:expression 两数的关系比较: email E ...

  9. python_way day16 DOM

    Python_way day16 1.Dom  (找到html中的标签) 一.DOM 1.查找元素 直接查找 document.getElementById 根据ID获取一个标签 --->这里是 ...

  10. Sublime Text 2 快捷键用法大全(转)

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...