【性能优化】纳尼?内存又溢出了?!是时候总结一波了!!
案例介绍
这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。
接下来,我们就以代码案例的形式来分析各种内存溢出的情况。
定义主类结构
首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。
public class BlowUpJVM {
}
栈深度溢出
public static void testStackOverFlow(){ BlowUpJVM.testStackOverFlow();
}
栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。
永久代内存溢出
public static void testPergemOutOfMemory1(){ //方法一失败 List<String> list = new ArrayList<String>(); 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<StringBuffer> list = new ArrayList<StringBuffer>(); while(true){ StringBuffer B = new StringBuffer(); for(int i = 0 ; i < 10000 ; i++){ B.append(i); } list.add(B); }
}
不断往堆中塞新增的StringBuffer对象,堆满了就直接溢出了。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼如有收获,点个在看,诚挚感谢
【性能优化】纳尼?内存又溢出了?!是时候总结一波了!!相关推荐
- Android 性能优化之内存泄漏检测以及内存优化(上)
在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来 ...
- Android进阶——性能优化之内存管理机制和垃圾采集回收机制(六)
文章大纲 引言 一.内存泄漏和内存溢出概述 二.Java运行时内存模型 1.线程私有数据区 1.1.程序计数器PC 1.2.虚拟机栈 1.3 本地方法栈 2.所有线程共享数据区 2.1.Java堆 2 ...
- Android 系统性能优化(55)---Android 性能优化之内存优化
Android 性能优化之内存优化 前言 Android App优化这个问题,我相信是Android开发者一个永恒的话题.本篇文章也不例外,也是来讲解一下Android内存优化.那么本篇文章有什么不同 ...
- 第一章:unity性能优化之内存优化
目录 前言 unity性能优化之内存的优化 一.unity Analysis工具的使用. 二.内存优化方法 1.设置和压缩图片 2.图片格式 3.动画文件 4.模型 5.RenderTexture(R ...
- 有了这篇你还说你不会redis性能优化、内存分析及优化
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...
- Android性能优化之内存篇
2019独角兽企业重金招聘Python工程师标准>>> Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化 ...
- android—性能优化2—内存优化
文章目录 性能优化: 工具: memory profiler LeakCanary arthook epic 库 java内存管理机制 java 内存回收机制 Android内存管理机制 Dalvik ...
- App优化以及内存泄漏溢出优化
目录介绍 1.OOM和崩溃优化 1.1 OOM优化 1.2 ANR优化 1.3 Crash优化 2.内存泄漏优化 2.0 动画资源未释放 2.1 错误使用单利 2.2 错误使用静态变量 2.3 han ...
- Android性能优化OOM内存管理——ADJ
前言 OOM_ADJ (Out of Memory Adjustment)是android系统在内存不足情况下进行内存调整的重要参数.在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用 ...
- Android性能优化之内存优化 1
导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存.然而大部分的开发者观看下自己的异常上报系统,还是 ...
最新文章
- python比较两个xml_python比较2个xml内容的方法
- 深度丨MIT重磅报告:一文看清AI商业化现状与未来
- 编程之美3.7 队列中最大值问题
- JS 获取 鼠标 坐标
- php开发领域,PHP-MySQL相关领域
- 但这是不可能的,或者无法发现JIT破坏了您的代码。
- 深入掌握JMS(二):一个JMS例子
- Svcutil.exe详解
- 称重指示器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 关于Excel导入SQLServer的说明
- 计算机网络实验二局域网络搭建,计算机网络实验二简单共享局域网组建.doc
- C# winform程序调用屏幕键盘
- CF 379F: New Year Tree
- Excel 入门基础
- 10_07【Java】Map集合详述
- C语言-输入任意多个数字,存到整型数组,支持任意间隔符,同时支持输入字母存到字符数组中
- python 压缩图片为指定大小
- C++代码破解LOL人物基址特征,基址在源码里面自己找!
- eclipse中输入中文为繁体
- InstanceNorm1d
热门文章
- LINUX按照物理地址预取,linux – 如何以编程方式禁用硬件预取?
- php 去掉img,php怎样去掉img标签
- 李超线段树(Li-Chao Segment Tree)
- 大数据精准投放平台_大数据库(可视化精准平台,能够使您的广告更加精准有效)...
- P1444 [USACO1.3]虫洞 wormhole,新手向超详细讲解(搜索、判环、拆点、好题)
- HDU 4635 Strongly connected(缩点、最多可加边数使得仍然非强连通)
- 置换群和Burnside引理,Polya定理
- 模板 - 无向图的连通性
- 幸运数字Ⅱ(树型结构构造答案,打表)难度⭐⭐
- 690.员工的重要性