JVM内存溢出的几种情形
1.堆溢出
原因:大量对象占据了堆空间,而这些对象都有强引用导致无法回收,当对象大小之和>Xmx参数指定的堆大小时导致溢出!
List<byte[]> list = new ArrayList<>();for (int i = 0; i < 10240; i++) {list.add(new byte[1024 * 1024]);}
解决方法是使用-Xmx增大堆大小,但是堆空间毕竟不能无限增长,所以需要使用MAT和VM等工具找到大量占用堆空间的对象做出合理的程序优化。
直接内存溢出
NIO直接向操作系统申请,但是由于没有内JVM托管,如果使用不当也会导致内存溢出。
过多线程导致OOM
因为每个线程需要占用系统内存,当线程过多可能导致OOM,线程的栈空间是在堆外分配,和直接内存很相似,如果要系统支持更多的线程,那么应该使用小的堆空间。
解决办法:
1).减少堆空间 -Xmx512m 这样操作系统可以预留更多内存用于线程创建 因此程序可以正常运行
2).减少线程所占的内存空间,使用-Xss可以指定栈空间 -Xmx1g -Xss128k
使用1G堆空间,但是栈空间减少到128K,剩余可以用的内存可以容纳更多的线程,但是减少栈空间,栈溢出的风险增加。
3).减少线程总数
2.栈溢出
java虚拟机规范定义了两种异常与栈空间有关:StackOverflowError和OutOfMemoryError
线程计算过程中 栈深度>最大可用栈深度 抛出StackOverflowError
如果栈可以动态扩展,如果扩展过程中没有足够内存空间支持会抛出OutOfMemoryError
-Xss设置栈大小,栈大小决定了函数调用的可达深度
虚拟机栈在运行时使用了栈帧的数据结构保持上下文数据,栈帧中存放了局部变量表,操作数栈,动态连接方法和返回地址等信息。
每一个方法的调用都伴随着栈帧的入栈操作,函数返回表示出栈。如果参数和局部变量过多那么栈帧的局部变量表会变大。
无限递归导致
public class TestDemo {private int count = 0;public void recursion() {count++;recursion();}@Testpublic void testStack() {try {recursion();} catch (Throwable e) {System.out.println("深度>>>" + count);e.printStackTrace();}}
}
jclasslib可以查看class文件每个方法分配的局部变量表内容,
下载地址:https://github.com/ingokegel/jclasslib/releases
在栈帧中与性能调优关系最密切的就是局部变量表:函数的参数+函数内局部变量,局部变量表以字为单位,一个字32位长,long和double占2字,其余1字。
对于非static方法虚拟机还将对象this作为参数通过局部变量表传递给当前方法。
3.永久区溢出
如果系统定义了太多的类型,那么永久区会溢出,Jdk1.8中永久区被称为元数据的区域代替,但是功能是类似的,都是保持类的元信息。
例如使用Cglib动态产生新类(而不是new对象)N次会都爱吃OOM异常。
解决办法:
1.增加MaxPermSize
2.减少系统需要的类的数量
3.使用ClassLoader合理的装载类定期回收
参考《Java程序性能优化 让你的Java程序更快、更稳定》
相关文章:

Android Market 链接的生成与分享
通过Java包名直接定位到你的App http://market.android.com/details?id<java包名> 或者 market://details?id<java包名> 范例:market://details?idcom.skyd.luckywheel 这将直接在菜市场中显示你的App详细介绍页。 通过Java包名搜索App http://marke…
Centos6/7下静默安装oracle10g
Centos6/7下静默安装Oracle10g 远程安装oracle10g,通过网上资料,不断摸索成功安装。先在本地虚拟机Centos7上做实验,快照恢复快照恢复,安装了几十次成功之后,再在服务器Centos6上安装,(6和7还是有区别的,比…
String和常量池
jdk1.6之前常量池属于永久代,jdk1.7以后移到堆中。 String s1 "abc";// 放在常量池中String s2 "abc";// 从常量池中查找String s3 new String("abc");//new放在堆中String s4 new String("abc");String s5 s1.inter…

CQRS体系结构模式实践案例:Tiny Library:领域仓储与事件存储
领域仓储(Domain Repository)与事件存储(Event Store)是CQRS体系结构应用系统中C部分(Command部分)的重要组件。虽然都是存储机制,但两者有着本质的区别:领域仓储是属于领域层的&…
中国开启开源新纪元
距离“中国 Linux 第一人”宫敏博士用手提肩背的方式,将 20 盒装有 80G 容量的自由软件磁带背回中国转瞬已过 20 载,在宫敏博士的推动下,中国组建起国内第一个自由软件库,由此开源在第一代开发者心中的火种迅速传播。20 多年间&am…

kernel logo到开机动画之间闪现黑屏(android 5.X)
在BootAnimation開始画图之前,会先做一次clear screen的动作,避免出现前面的图干扰到BootAnimation的显示。 通过check main_log先确认播放开机动画是哪个function。在相应function删除clear screen的动作的相应代码。 /frameworks/base/cmds/bootanimat…

JScript Array对象的几个原型方法
代码 Array.prototype.inArray function(value) { for(vari 0; i <this.length; i) { if(this[i] value) { returntrue; } } returnfalse;};Array.prototype.max function() { for(vari 1, max this[0]; i <this.length; i) { …
太生猛!AI应届生年薪涨到80万!网友:后悔生的太早
据中国青年报报道:新冠肺炎疫情期间,非接触类交互、安全卫生等需求提升,以数字货币、数据应用、人工智能为代表的数字经济显著发展,全球经济数字化转型踩下“油门”。中国人工智能人才很可能缺口超过500万人。其实,早在…
Tomcat定时任务
原文: The load-on-startup element indicates that this servlet should be loaded (instantiated and have its init() called) on the startup of the web application. The optional contents of these element …

Nutanix CE on Lenovo W520 初探
話說 Nutanix 出了 CE 版本,這當然要來試試看 Nutanix 威力拿了部機器lenovo W520 CPU: i7-2820QM 4 coreRam: 32GBHDD:500G安裝選單選擇鍵盤配置,按下 ProceedNutanix 開始載入程式硬件最低需求不滿足Laptop 32G 內存Lenovo W520Nutanix 官方 CE 最低硬…

《爱情公寓2》将播 恶搞宣传片大喊“有种别看”
昨晚,一支重口味的宣传片消然出现在各大网站,一夜之间在狂转发。上线不到一小时,单一网站浏览量就超十万,视频主标写着:神兽组合从天而降,口味超重,少儿不宜,人兽悲剧,蛋…
“应付”大学作业,我花3小时写了一个“文本转手写”神器
作者 | Saurabh Daware译者 | 弯月,责编 | 郭芮来源 | CSDN(ID:CSDNnews)最近,有一个名叫Saurabh Daware的印度大学生只花了3个小时就编写了一款自动化工具,能够将文本转换成手写文字,并用这个工…

Laravel应用
CLI 参考:http://laravel-china.org/docs/5.1/artisancli处理业务,把业务封装成一个命令,用php artisan来调用自定义的命令放在App/Console/Commands下创建方式php artisan make:console 命令名 —command调用时名字php artisan make:console…

匿名内部类和传接口
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 参考:http://www.cnblogs.com/nerxious/archive/2013/01/…
为什么这门技术如此重要?错过这次黄金期,就晚了!
老李一直怀疑自己是不是年纪大了,脑子跟不上了。作为十几年经验的资深 Java 工程师,维护这公司产品的核心代码的他,现在迭代产品的时候,经常出 Bug 。有时修复一个 Bug 时间,比开发一个需求的时间要长很多,…

字符编码简介 ANSI Unicode Unicode big endian UTF-8
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和 1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte࿰…

ReactiveCocoa代码实践之-更多思考
三.ReactiveCocoa代码实践之-更多思考 1. RACObserve()宏形参写法的区别 之前写代码考虑过 RACObserve(self.timeLabel , text) 和 RACObserve(self , timeLabel.text) 的区别。 因为这两种方法都是观察self.timeLabel.text的属性,并且都能实现功能。估计是作者原本…

Java常用命令及Java Dump
线程Dump,包含所有线程的运行状态。纯文本格式。 堆Dump,包含线程Dump,幵包含所有堆对象的状态。二进制格式。 Java Dump方法 1.使用Java虚拟机制作Dump 指示虚拟机在发生内存不足错误时,自动生成堆Dump -XX:HeapDumpOnOutOfMemoryError 2.使用图形化工具制作Dump 使用JDK…

使用Windows远程登录Ubuntu
一、SSH登录 1、Ubuntu默认没有安装SSH ,可以在新得利软件安装程序里,搜索SSH,标记并安装; 或者使用命令: sudo apt-get install openssh-server sudo /etc/init.d/ssh restart ssh localhost…
紧急更新下降难度,《王者荣耀》绝悟 AI 难倒一片玩家
作者 | 神经星星来源 | HyperAI超神经(ID: HyperAI)在 5 月 1 日~ 5 月 4 日期间,玩家通过《王者荣耀》最新版本客户端进入游戏,即可与绝悟 AI 对战。一时间哀鸿遍野,普通玩家、游戏主播、职业选手,纷纷表示…

SQL:安装多个实例,修改实例端口号,和IP加端口号连接实例
原文:SQL:安装多个实例,修改实例端口号,和IP加端口号连接实例sql server 安装第一个实例,默认实例的端口是1433, 一个库中如果有多个实例,从第二个实例开始的端口是动态端口,需要的话,自己手工指…
用“逐步排除”的方法定位Java服务线上“系统性”故障
说明:原文地址已经不可访问,其他地方有转载,不过很多丢失图片,所以,找到一处有图的重新配好图。 用“逐步排除”的方法定位Java服务线上“系统性”故障 Posted on 2014/08/25李斯宁(高级测试开发工程师&…
清华硕士爆料:这些才是机器学习必备的数学基础
现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

LINUX环境下资源下载中文目录及中文文件名称问题
为什么80%的码农都做不了架构师?>>> http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E4%B8%AD%E6%96%87%E7%9B%AE%E5%BD%95%E5%8F%8A%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6%E5%90%8D%E7%A7%B…

dojo从asp.net中获取json数据
搞来有搞去终于有了个结果,主要是一开始犯了一些低级错误。 对于json不太了解的童鞋,可以看看这个:http://www.dreamdu.com/blog/2008/10/19/json_in_javascript/ 这个例子中主要是从数据库中读取数据,转换成JSON格式,…

RHEL5 install
RHEL5 安装转载于:https://blog.51cto.com/bhanv/477708
线上java问题排查
0.jps 这个输出java进程pid #jps 查看java的线程 #top -Hp 25448 如图25757这个线程比较耗时,看看他在做什么 注意需要折算出线程pid的16进制值,然后jstack。 可以打印更多信息 #jstack pid | grep -A 20 649d 参考:JVM调优之jstack找出…
GitHub标星10,000+,Apache项目ShardingSphere的开源之路
【编者按】几天前,当 GitHub 全球产品技术生态总经理 Michael Francisco 谈到中国开发者已经成为 GitHub 上最活跃的群体时,有开发者提出数量之后质量也要跟上。的确,过去十数年间,中国开源一直呈现企业热使用热社区冷开发冷的景象…

JAVA中LOCK
原文链接:http://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 我们知道如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的…
【公开课预告】AutoML知多少
5月7日周四19:00,商汤泰坦公开课第010期,论文解读系列课程第二期即将开播!我们邀请到商汤科技的4位研究员,分享团队在AutoML方面的一系列研究工作,其中包含CVPR 2020、ICLR 2020等多篇最新论文成果,想要了解…