当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,假设GC完还是不够,或者申请的直接超够VM可能有的,就会抛出内 存溢出异常。从VM规范中我们能够得到,一下几种异常。

java.lang.StackOverflowError:(非常少)

java.lang.OutOfMemoryError:heap space(比較常见)

java.lang.OutOfMemoryError: PermGen space (常常出现)

java.lang.OutOfMemoryError: GC overhead limit exceeded(某项操作使用大量内存时发生)

下面分别解释一下,从最常见的開始:

java.lang.OutOfMemoryError: PermGen space 这个异常比較常见,是说JVM里的Perm内 存区的异常溢出,因为JVM在默认的情况下,Perm默觉得64M,而非常多程序须要大量的Perm区内 存,尤其使用到像Spring等框架的时候,因为须要使用到动态生成类,而这些类不能被GC自己主动释放,所以导致OutOfMemoryError:
PermGen space异常。解决方法非常easy,增大JVM的 -XX:MaxPermSize 启动參数,就能够解决问题,如过使用的是默认变量一般是64M[5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.],改成128M就能够了,-XX:MaxPermSize=128m。假设已经是128m(Eclipse已经是128m了),就改成 256m。我一般在server上为安全起见,改成256m。

java.lang.OutOfMemoryError:heap space或其他OutOfMemoryError,这个异常实际上跟上面的异常是一个异常,但解决方法不同,所以分开来写。上面那个异常是由于JVM的perm区内 存区分少了引起的(JVM的内 存区分为 young,old,perm三种)。而这个异常是由于JVM堆内
存或者说整体分少了。解决方法是更改 -Xms -Xmx 启动參数,一般是扩大1倍。xms是管理启动时最小内 存量的,xmx是管里JVM最大的内 存量的。

注:OutOfMemoryError可能有非常多种原因,依据JVM Specification, 可能有一下几种情况,我先简单列出。stack:stack分区不能动态扩展,或不足以生成新的线程。Heap:须要很多其它的内 存,而不能获得。Method Area :假设不能满足分配需求。runtime constant pool(从Method Area分配内 存)不足以创建class or interface。native method stacks不可以动态扩展,或生成新的本地线程。

java.lang.OutOfMemoryError: GC overhead limit exceeded,这个是JDK6新添的错误类型。这个hotspot VM1.6定义的一个策略,是一种保护机制,通过计算GC时间来预測是否须要OOM了,提前抛出异常,防止OOM的发生,官方的定义是:并行/并发回收器在GC回收时间过长会抛出OutOfMemoryError(过长的定义是超过98%的时间用来GC并回收了不到2%的堆内存,用来避免内存过小造成应用不能正常工作。我在JSP导大Excel的时候碰到过。终于解决方式是,关闭该功能,使用——
-XX:-UseGCOverheadLimit,预測OOM有啥用呢?尽管可能不能终于解救你的应用,可是能够在挂掉前做最后的挣扎,比方数据保存和保存现场(Heap Dump),当然这个策略会带来比方载入某一个大内存时频繁OOM。增加生产环境遇到这个问题,在不知道原因的情况下不要简单规避这个问题,能够通过-verbose:gc -XX:+PrintGCDetails看一下究竟是什么原因造成的异常。通常原因都是由于年老代(old区)占用过多导致频繁FullGC,终于导致GC overhead limit exceed。假设gc
log不够能够借助JProfile等工具查看内存占用,old区是否有内存泄漏。。分析内存泄漏有一个方法 -XX:HeapDumpOnOutOfMemoryError, 这样OOM时会自己主动做Heap Dump,能够拿MAT来排查了。另外留意新生代(young区),假设有过多短暂对象分配,可能也会导致这个异常。

最后说说java.lang.StackOverflowError,老实说这个异常我也没碰见过,但JVM Specification就提一下,规范上说有一下几种境况可能抛出这个异常,一个是Stacks里的线程超过同意的时候,还有一个是当native method要求更大的内
存,而超过native method同意的内 存的时候。依据SUN的文档,提高-XX:ThreadStackSize=512的值。

总的来说调优JVM的内 存,组要目的就是在使用内 存尽可能小的,使程序执行正常,不抛出内 纯溢出的bug。并且要调好最小内 存,最大内 存的比,避免GC时浪费太多时间,尤其是要尽量避免FULL GC。

补充:因为JDK1.4新增了nio,而nio的buffer分配内存比較特殊(读写流能够共享内存)。假设有大量数据交互,也可能导致java.lang.OutOfMemoryError。对应的JDK新增了一个特殊的參数:-XX:MaxDirectMemorySize 默认是64M,能够改大些如128M。

-XX:MaxDirectMemorySize=<size>

Specifies the maximum amount of memory in bytes that the Java™ NIO library can allocate for direct memory buffers. The default is 64 megabytes, which corresponds to

-XX:MaxDirectMemorySize=64m . The use of direct memory buffers can minimize the copying cost when doing I/O operations.


jvm调优经验分享的更多相关文章

  1. MYSQL企业常用架构与调优经验分享

    一.选择Percona Server.MariaDB还是MYSQL  mysql应用源码:http://www.jinhusns.com/Products/Download/?type=xcj 1.M ...

  2. MYSQL 企业常用架构与调优经验分享

    一.选择Percona Server.MariaDB还是MYSQL  mysql应用源码:http://www.jinhusns.com/Products/Download/?type=xcj 1.M ...

  3. JVM调优之经验

    在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...

  4. 性能调优案例分享:jvm crash的原因 1

    性能调优案例分享:jvm crash的原因   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  5. 老李分享:JVM调优

    老李分享:JVM调优   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...

  6. jvm 性能调优 经验总结---转

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  7. JVM性能调优经验总结

    本文转载自JVM性能调优经验总结 说明 调优是一个循序渐进的过程,必然需要经历多次迭代,最终才能换取一个较好的折中方案. 在JVM调优这个领域,没有任何一种调优方案是适用于所有应用场景的,同时,切勿极 ...

  8. JVM调优(二)经验参数设置

    调优设置具体解析 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5 ...

  9. JVM调优的几种策略(转)

    JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用.下面是本人一些JVM调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2 ...

随机推荐

  1. [置顶] think in java interview-高级开发人员面试宝典(八)

    面经出了7套,收到许多读者的Email,有许多人说了,这些基础知识是不是为了后面进一步的”通向架构师的道路“做准备的? 对的,你们没有猜错,就是这样的,我一直在酝酿后面的”通向架构师的道路“如何开章. ...

  2. 如何在Windows上配置EBS R12.1.3的OAF开发环境

    1.找到想要开发的EBS OAF扩展对应的PATCH,可以参照下面的Note,因为我要做的是R12.1.3的开发,所以要下载p9879989_R12_GENERIC OA Framework - Ho ...

  3. uboot代码1:uboot启动大体流程, stage1 + stage2

    start.S stage 1: reset: set the cpu to svc32 mode disable the watchdog mask all IRQs(INTMSK, INTSUBM ...

  4. SqlServer数据库存储过程的使用

    搞开发这么久了,说实话很少用到存储过程,大部分代码都在业务层给处理了. 今天在做APP接口的时候,表里面没有数据,需要模拟一些数据,于是就想到存储过程,来一起用下吧. SqlServer中创建存储过程 ...

  5. python之数据库操作(sqlite)

    python之数据库操作(sqlite) 不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接A ...

  6. C++ 中使用boost::property_tree读取解析ini文件

    boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是  ...

  7. fullcalendar日历控件知识点集合

    1.基本的语法: 首先,fullcalendar和JQUERY一样,以面向对象的方式来组织代码.当然,这里的面向对象不过指能够把整个fullcalendar理解为一个类,这个类里包含有非常多的属性.方 ...

  8. bootbox api

    bootbox是boostrap集成的弹窗,基本能完成后台系统的需求,下面是一些使用方法 1.bootbox.alert bootbox.alert使用方法主要有三种 直接传内容 bootbox.al ...

  9. 设置MyEclipse中代码的换行长度

    1.打开Preferences -> Java -> Code Style -> Formatter. 2.选择Edit -> Line Wrapping  -> Max ...

  10. javascript定义类和类的实现

    首先说说类,在一个类里我们会有以下的几个特征: 1. 公有方法 2. 私有方法 3. 属性 4. 私有变量 5. 析构函数 我们直接看一个例子: /***定义类***/ var Class = fun ...