转载自  Java中的OutOfMemoryError

引子:今天在<Sharding-JDBC官方群>里有个哥们称“不连sjdbc不会把内存吃光,连sjdbc跑一会就把内存吃光”,倍感诧异,我们已经用sj很久了,一直未发现sj吃内存的情况,遂向他要了测试程序。测试之后才发现他所谓的吃内存是报了“java.lang.OutOfMemoryError: unable to create new native thread”的错,殊不知创建线程不使用JVM Memory,这个报错不是程序吃内存,跟sjdbc更是没有关系。他的数据库连接池maxActive=30,开线程较多时(我开了10000个),前面的线程没有释放数据库连接,后面的线程就要等待,造成线程积压,最终无法创建新线程,自然“unable to create new native thread”。所以还需要扫盲式的向诸位普及一下Java中的内存溢出。

1.java.lang.OutOfMemoryError: unable to create new native thread

就是上面例子里面提到的情况。Java中当你创建线程的时候,JVM会在JVM 内存创建一个Thread同时创建一个系统本地线程,这个系统线程使用的内存不是JVM memory,而是系统剩余的内存,所以遇到这种情况有时候需要通过“减少内存”的手段来解决(指减少堆内存)。通常情况下我们有个计算公式来估算能创建线程数的多少:countOfThreads=(processMaxMemory - JVM Memory - otherOsMemory) / (threadStackSize) ,这里的MaxProcessMemory是指一个进程可以占用的最大内存,比如在32位window下是2G,otherOsMemory是保留的操作系统内存,threadStackSize是通过-Xss参数设置的线程栈大小,当然,还会受到系统最大可创建的线程数量的限制。

2.Java.lang.OutOfMemoryError: Java heap space

这种是我们最常见的Java堆溢出,我们配置JVM参数时使用-Xms配置堆的最小值,使用-Xmx配置堆的最大值(通常会将-Xms和-Xmx配置成相同,避免堆的自动扩展)。Java堆中存放的是对象实例,当Java堆中对象达到限制就会产生内存溢出,常见的情况有:死循环往一个List中添加对象,一次性将大文件或者从数据库查询的大批量数据加载到内存中。对于这种情况,我们通过JVM配置-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Data/domains/trans-account/server1/logs来保存内存快照,然后用相关内存分析工具进行分析。

3. java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是内存的永久保存区域,主要存储虚拟机加载的类、常量、静态变量等元数据信息,垃圾收集行为在这个区域几乎不出现。对于有大量JSP、大量使用CGLib字节码增强的应用,会很容易出现这种错误,出现问题时,我们经常通过增大-XX:MaxPermSize参数来解决。

4. java.lang.OutOfMemoryError: GC overhead limit exceeded

GC overhead limt exceed检查是Hotspot VM定义的一个策略,通过统计GC时间来预测是否要OOM了,提前抛出异常,防止OOM发生。官方对此的定义是:“并行/并发回收器在GC回收时间过长时会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。用来避免内存过小造成应用不能正常工作。”这种情况跟第二种情况有重合的地方,也是通过检查是否有死循环或者占用大内存的代码,当然,可以使用-XX:-UseGCOverheadLimit(默认是+UseGCOverheadLimit)来去除GC时间的限制。

5. java.lang.OutOfMemoryError: nativeGetNewTLA

这个错误只有在JRockit的JVM上才会遇到,大家工作环境中如果都默认使用Hotspot的话应该不会遇到这个问题,所以如果大家不感兴趣完全可以不care(真的,私以为,没有业务场景基础的技术意淫都是耍流氓)。TLA是Thread Local Area(线程本地空间)的简写,线程本地空间是多线程程序里面为了更有效的进行内存分配而建立的缓存。每一个线程都有一份自己的缓存,当这个线程要创建对象的时候,就在这上面分配。如果你有很多线程同时并发,又要创建大量的对象,可能会出现这个问题。

6.java.lang.OutOfMemoryError: Requested array size exceeds VM limit

这个错误比较少见,除非你真的new了一个非常非常大的数组(比如,一个亿?YOU CAN TRY~)当出现这种情况,与其去增大JVM的-Xmx,不如好好看下你的代码逻辑是不是出现了什么问题。

7.java.lang.OutOfMemoryError: request xxxxxx(size) bytes for xxxxxxx(reason). Out of swap space?

额,这种情况我真没遇到过,不过我们可以了解一下:它是当虚拟机向本地操作系统申请内存失败时抛出的。这和你用完了堆或者持久化中的内存的情况有些不同。这个错误通常是在你的程序已经逼近平台限制的时候产生的。这个信息告诉你的是你可能已经用光了物理内存以及虚拟内存了。由于虚拟内存通常是用磁盘作为交换分区,因此你最先想到的解决方法可能是先增加交换分区的大小。

8.java.lang.OutOfMemoryError: xxxx<reason> xxxx<stack trace>(Native method)

这种报错是从native method中抛出的,不是JVM执行的方法,如果遇到这种情况,咳,自求多福吧。

Java中的OutOfMemoryError相关推荐

  1. Java中的OutOfMemoryError的各种情况及解决方法

    转载自博客园:https://www.cnblogs.com/duanxz/p/4901437.html Java中的OutOfMemoryError的各种情况及解决和JVM内存结构 在JVM中内存一 ...

  2. Java中的OutOfMemoryError的各种情况及解决和JVM内存结构

    在JVM中内存一共有3种:Heap(堆内存),Non-Heap(非堆内存) [3]和Native(本地内存). [1] 堆内存是运行时分配所有类实例和数组的一块内存区域.非堆内存包含方法区和JVM内部 ...

  3. Java中OutOfMemoryError(内存溢出)的原理及解决办法

    Java中的OutOfMemoryError,即内存溢出,而无论是哪种内存溢出,都可以通过增加对应JVM内存空间解决:即修改对应内存参数的大小 根据内存区域的不同,存在多种情况,下面介绍最常见的几种情 ...

  4. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

  5. java中引用类型_您真的了解Java中的4种引用类型吗?

    Java中提供了四个级别的引用:SoftReference,FinalReference,WeakReference和PhantomReference.在四种引用类型中,只有FinalReferenc ...

  6. Java中的多线程你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  7. java抛出数组格式异常,Java中异常

    一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...

  8. java 中的finally你知多少_Java 处理异常 9 个最佳实践,你知道几个?

    1. 在Finally中清理资源或者使用Try-With-Resource语句使用Finally Java 7的Try-With-Resource语句 2. 给出准确的异常处理信息 3. 记录你所指定 ...

  9. JAVA中常见的Exception

    这篇文章转载自 : JAVA中常见的Exception 常见的几种如下: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常. I ...

最新文章

  1. neo4j客户端下载
  2. 强制修改上网本分辨率
  3. 9.82万枚ETH在近一周被质押至以太坊2.0合约
  4. fukk _GNU_SOURCE __USE_GNU
  5. 不要奢望.NET能够跨平台
  6. pjsip在windows上编译
  7. bzero函数_Poll 函数
  8. 数据包络分析-BCC模型
  9. ERP和SAP是什么意思?
  10. 手机APP——扫描全能王去除水印字样
  11. GDPR 和个人信息保护的小知识
  12. ssm 远程监控linux,Wisenet SSM视频监控综合管理平台
  13. 七牛云 -数据的增加和删除(vue+egg+element-ui+axios)
  14. 从腾讯企业邮箱转到网易企业邮箱的正确姿势
  15. mysql8.0 报错2059_mysql8.0连接报2059错误
  16. 在Java中获取两个数的中间值(超大数值)
  17. 什么是SAFe(规模化敏捷框架)3——敏捷发布火车(下)
  18. 一个C病毒 - -!
  19. mysql 取年月_MySQL 获取指定时间段的年月
  20. 西门子200恒压供水梯形图_S7-200 PLC控制的变频调速恒压供水系统设计

热门文章

  1. java numberformat异常_Java NumberFormat格式化float类型的bug
  2. [C++11]独占的智能指针unique_ptr的删除器
  3. [PAT乙级]1011 A+B 和 C
  4. 算法-排序-冒泡排序
  5. 微信小程序点击按钮弹出弹窗_微信小程序实现的点击按钮 弹出底部上拉菜单功能示例...
  6. 前端demo_【前端3分钟】Script Error产生的原因和解法
  7. python unpack_ip地址处理每天10行python代码系列
  8. CoreJava 笔记总结-第七章 异常,断言和日志
  9. mysql_result函数用不了_mysql_result()函数怎么在PHP中使用
  10. Java开发Web Service的几种解决方案