内存溢出案例_「性能优化」纳尼?内存又溢出了?是时候总结一波了
写在前面
相信小伙伴们在平时工作的过程中,或多或少都会遇到一个场景:内存溢出。如果你没有遇到过这个场景,那就说明你是个假的程序员。哈哈,开个玩笑,平时工作过程中,我们确实会遇到这个问题。今天,我就将平时工作过程中遇到的内存溢出情况做个简单的总结,以通俗易懂的代码案例的形式直观的分享给大家。希望能够为小伙伴们带来实质性的帮助。
案例介绍
这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。
接下来,我们就以代码案例的形式来分析各种内存溢出的情况。
定义主类结构
首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。
public class BlowUpJVM { }
栈深度溢出
public static void testStackOverFlow(){ BlowUpJVM.testStackOverFlow(); }
栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。
永久代内存溢出
public static void testPergemOutOfMemory1(){ //方法一失败 List list = new ArrayList(); while(true){ list.add(UUID.randomUUID().toString().intern()); } }
打算把String常量池堆满,没想到失败了,JDK1.7后常量池放到了堆里,也能进行垃圾回收了。
然后换种方式,使用cglib,用Class把老年代取堆满
public static void testPergemOutOfMemory2(){ try { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOM.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, args); } }); enhancer.create(); } } catch (Exception e){ e.printStackTrace(); } }
虚拟机成功内存溢出了,那JDK动态代理产生的类能不能溢出呢?
public static void testPergemOutOfMemory3(){ while(true){ final OOM oom = new OOM(); Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(oom, args); return result; } }); } }
事实表明,JDK动态代理产生
的类不会造成内存溢出,原因是:JDK动态代理产生的类信息,不会放到永久代中,而是放在堆中。
本地方法栈溢出
public static void testNativeMethodOutOfMemory(){ int j = 0; while(true){ Printer.println(j++); ExecutorService executors = Executors.newFixedThreadPool(50); int i=0; while(i++<10){ executors.submit(new Runnable() { public void run() { } }); } } }
这个的原理就是不断创建线程池,而每个线程池都创建10个线程,这些线程池都是在本地方法区的,久而久之,本地方法区就溢出了。
JVM栈内存溢出
public static void testStackOutOfMemory(){ while (true) { Thread thread = new Thread(new Runnable() { public void run() { while(true){ } } }); thread.start(); } }
线程的创建会直接在JVM栈中创建,但是本例子中,没看到内存溢出,主机先挂了,不是JVM挂了,真的是主机挂了,无论在mac还是在windows,都挂了。
温馨提示,这个真的会死机的。
堆溢出
public static void testOutOfHeapMemory(){ List list = new ArrayList(); while(true){ StringBuffer B = new StringBuffer(); for(int i = 0 ; i
不断往堆中塞新增的StringBuffer对象,堆满了就直接溢出了。
重磅福利
微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!
另外,我开源的各个PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!
写在最后
如果你觉得冰河写得还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!
内存溢出案例_「性能优化」纳尼?内存又溢出了?是时候总结一波了相关推荐
- 「性能优化」首屏时间从12.67s到1.06s,我是如何做到的?
--本文是对之前同名文章的修正,将所有webpack3的内容更新为webpack4,以及加入了笔者近期在公司工作中学习到的自动化思想,对文章内容作了进一步提升. 0.引言 作为互联网项目,最重要的便是 ...
- android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总
线程调度与线程调度模型 任意时刻,只有一个线程占用 CPU,处于运行状态.而多线程并发执行就是轮流获取 CPU 执行权. 分时调用模型 轮流获取 CPU 执行权,均分 CPU 执行时间. 抢占式调度模 ...
- rdd数据存内存 数据量_「大数据」(七十七) Spark之IO机制
[导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[77]篇文章,欢迎阅读和收藏] 1 基本概念 与传统的 IO 相比, Spark IO 有很大区别.传统的数据存在单个计算 ...
- 「性能优化系列」APP内存优化理论与实践
当一个应用同时运行越来越多的任务以及复杂的业务,Android系统的内存管理机制已经无法满足内存的释放与回收,为了应用的稳定性与性能,去控制内存的创建和回收就成为了一个重要的命题. 本篇文章主要涉及内 ...
- 三星oneui主屏幕费电_都 9012 年了,三星系统还「负优化」吗?
近日,三星正式向国内 Galaxy S9 系列.Note9 系列推送了 Android 9 正式版.此次除了系统版本的重大升级外,三星还为用户带来全新设计的用户界面:One UI. 在宣传中,三星称 ...
- 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)
欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我csnd博客 也欢迎关注公 众 号[Ccww笔记],原创 ...
- 多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化
多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化 介绍 通常乳腺肿块的检测基于双视图乳腺摄影,医生在阅片是会将所有可用视图的信息组合在一起,他们比较MLO和CC视图,寻找不对称性并评估相对于先前 ...
- big sur 虚拟机 网络_推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题...
欢迎关注公众号[Ccww技术博客],原创技术文章第一时间推出 一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图: JVM栈(Java Virtual ...
- go list指针_「GCTT 出品」Go 语言机制之内存剖析
前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针.栈.堆.逃逸分析和值/指针传递.这是第三篇,主要介绍堆和逃逸分析.(译者注:这一篇可 ...
最新文章
- java coverage exclude使用
- 学python人工智能需要多久_人工智能Python开发怎么学才能最快入门
- 一种新的在线学习的方法:能够克服单人多任务学习的困难!
- BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
- 中国代工厂的困惑:把大牌t恤卖到99块3件,还会有人买吗?
- Chrome谷歌浏览器新功能 删除主题更方便
- SysUtils.StrLCat
- 做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码
- python为运行为何出现乱码_我的python写入文件正常,打开后却是乱码格式为什么?...
- ConvMF论文解读
- 实战总结的7个C程序,好东西不私藏
- 双目测距原理 matlab,双目测距的基本原理
- drop_caches 释放哪些
- 证券公司信息化4_最核心的IT系统是什么?柜台系统的两个主要功能?一个交易过程是怎样的?
- win7工作组计算机无法连接打印机,win7无法访问共享打印机怎么解决
- 狼的故事11:以牙还牙
- 最强Python编程神器,真香!
- Springboot359的医院病历管理系统
- 六:分布式架构存储设计
- 【周志华机器学习】绪论
热门文章
- 批量搜索php文件,php文件批量下载
- 大疆云台和华为P30_大疆灵眸手机云台3软件升级 完美支持Mate30系列
- android中获取mac地址8.0,华为Mate10手机emui8.0系统怎么查看IP地址和mac地址?
- 强制history不记住敏感命令的方法
- 科技助力创业升级,看新零售无人超市如何突围?
- IEEE 2030.5智能逆变器实施指南(4)
- ML之CatboostC:基于titanic泰坦尼克数据集利用catboost算法实现二分类
- 2020年安全简报(2月)
- 桌面上我的计算机打不开怎么回事,双击我的电脑打不开怎么办,?
- Django连接使用SQL Server数据库(windows版)