Java中的OutOfMemoryError

转载自  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

这个错误只有在JRockitJVM上才会遇到,大家工作环境中如果都默认使用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执行的方法,如果遇到这种情况,咳,自求多福吧。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沉沦17年,这位昔日科技霸主、最值钱企业,终于回来了……

1999年12月30日&#xff0c;这是微软最高光的时刻。当天其股价创出历史最高位59.97美元/股&#xff0c;市值达到了6130亿美元&#xff0c;是有史以来最值钱的公司——直至13年后&#xff0c;苹果公司的市值才超越这一纪录。 ▲微软股价 处在新千年之交&#xff0c;意气风发的微…

mysql5.5安装配置 在阿里云服务器上 本地navicat连接

MySQL 5.5安装配置教程. 2018年03月20日 19:18:49 沸点数据 阅读数 18046 1、官网下载MySQL 5.5。 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、安装MySQL5.5 注意&#xff1a;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1…

Hibernate基本概念 (2)

框架&#xff1a;1.一个应用程序的半成品2.提供了一系列可以重用的API3.能开发效率更高&#xff0c;性能更好的项目Hibernate:持久化&#xff08;jdbc&#xff09; ORM( 对象 关系 映射)hibernate环境搭建1.导包&#xff1a;核心包&#xff0c;必须包&#xff0c;数据驱动包2…

通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)

遇到复杂而繁琐的html页面大家都望而却步。因为很难获取到相应的数据。最古老的办法的是尝试用正则表达式&#xff0c;估计那么繁琐的东西得不偿失&#xff0c;浪费我们宝贵的时间。第二个办法用开源组织htmlparser的包&#xff0c;这个是一个比较老的项目&#xff0c;但是效果…

JVM 调优系列之监控工具

转载自 JVM 调优系列之监控工具 摘要: 项目部署线上之后&#xff0c;我们该如何基于监控工具来快速定位问题.... 通过上一篇的jvm垃圾回收知识&#xff0c;我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具&#xff0c;有了理论指导&#xff0c;定位…

写给开发者:记录日志的10个建议

尽管在写这篇博文的时候&#xff0c;我是在负责运维工作&#xff0c;不过本文主要是写给开发者的。 对我来说&#xff0c;明白如何记录日志和记录什么&#xff0c;是软件工程师必须明了的最艰巨的任务之一。之所以这么说&#xff0c;是因为这项任务与预测&#xff08;divinatio…

解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误

解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误 2018年07月23日 16:55:42 犹抱琵琶半遮面 阅读数 29677 &#xff01;&#xff01;&#xff01;此类问题出现的原因是——不细心 一般的原因 Mapper interface和xml文件的定义对应…

Java 9 中的 GC 调优基础

转载自 Java 9 中的 GC 调优基础在经过了几次跳票之后&#xff0c;Java 9终于在原计划日期的整整一年之后发布了正式版。Java 9引入了很多新的特性&#xff0c;除了闪瞎眼的Module System和REPL&#xff0c;最重要的变化我认为是默认GC&#xff08;Garbage Collector&#xf…

mysql删除索引 增加索引

使用ALTER TABLE语句创建索引alter table table_name add index index_name (column_list) ; alter table table_name add unique (column_list) ; alter table table_name add primary key (column_list) ;删除索引drop index index_name on table_name ; alter table table_n…

Hibernate基本概念 (3)

一、hibernate配置&#xff1a;1.导jar包2.配置主文件a。数据库连接 url 驱动 用户名&#xff0c;密码&#xff0c;方言b。相关 显示sql&#xff0c;sql格式化c。映射文件3.映射文件表到实体 字段到属性查询&#xff1a;select dname from Dept d;参数&#xff1a;1.按位置&…

全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

在开发涉及到数据库的程序时&#xff0c;常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况&#xff0c;这时就需要进行数据库迁移。实现数据库迁移有很多种办法&#xff0c;从手动管理各个版本的ddl脚本&#xff0c;到实现自己的migrator&#xff0c;或是使用…

ThreadLocal 内存泄露的实例分析

转载自 ThreadLocal 内存泄露的实例分析前言 昨天分享了一篇深入分析 ThreadLocal 内存泄漏问题是从理论上分析ThreadLocal的内存泄漏问题&#xff0c;这一篇文章我们来分析一下实际的内存泄漏案例。分析问题的过程比结果更重要&#xff0c;理论结合实际才能彻底分析出内存泄…

ZKWeb网站框架的动态编译的实现原理

ZKWeb网站框架是一个自主开发的网页框架&#xff0c;实现了动态插件和自动编译功能。ZKWeb把一个文件夹当成是一个插件&#xff0c;无需使用csproj或xproj等形式的项目文件管理&#xff0c;并且支持修改插件代码后自动重新编译加载。 下面将说明ZKWeb如何实现这个功能&#xff…

Hibernate基本概念 (4)

一、缓存&#xff1a;提高性能1.一级缓存&#xff1a;session级别 一个session共享2.二级缓存&#xff1a;进程或群集级别 不同session可以共享步骤&#xff1a;1.导jar包 2.添加xml放到src3.配置hibernate.cfg.xmla.开启二级缓存b。缓存管理类4.配置持久化类使用二级缓存 3…

Java中的内存泄露的几种可能

转载自 Java中的内存泄露的几种可能Java内存泄漏引起的原因&#xff1a;内存泄漏是指无用对象&#xff08;不再使用的对象&#xff09;持续占有内存或无用对象的内存得不到及时释放&#xff0c;从而造成内存空间的浪费称为内存泄漏。长生命周期的对象持有短生命周期对象的引用…

Visual Studio“15”启动速度提升

在Visual Studio“15”开发工作的技术预览阶段&#xff0c;微软称自己的主要目标之一是改善性能。他们已经对这些改进进行过一定程度的介绍&#xff0c;最近又通过更全面的信息进一步介绍了这些变化。本文将介绍这些让VS“15”启动速度更快的改进。 更快速地启动VS“15” 微软项…

介绍Java中的内存泄漏

转载自 介绍Java中的内存泄漏Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象&#xff0c;Java的垃圾回收器帮你分配以及回收内存。然而&#xff0c;实际的情况并没有那么简单&#xff0c;因为内存泄漏在Java应用程序中还是时有发生的。 下面就解释下什么是内存…

2-6 基于SpringBoot的SpringSecurity环境快速搭建与验证

springboot是基于spring的一套全新的框架&#xff0c;其目的是为了简化spring的初始搭建和开发过程&#xff0c;不需要再做样板话的配置了 https://start.spring.io/ 上面这些都不想做权限拦截

DotLiquid模板引擎简介

DotLiquid是一个在.Net Framework上运行的模板引擎&#xff0c;采用Ruby的Liquid语法&#xff0c;这个语法广泛的用在Ruby on rails和Django等网页框架中。DotLiquid相比于Mvc默认模板引擎Razor的好处有&#xff1a; 因为不需要编译到程序集再载入首次渲染速度很快不会导致内存…

Hibernate基本概念 (5)

-----模板1.一对多(set)<set name"属性"><key column"关系外键"/><one-to-many class"实体类全名称"/></set>2.多对一<many-to-one name"" class"" column"关系外键"/>3.多对多(s…