700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 五种内存溢出案例总结:涵盖栈深度溢出 永久代内存溢出 本地方法栈溢出 JVM栈内存

五种内存溢出案例总结:涵盖栈深度溢出 永久代内存溢出 本地方法栈溢出 JVM栈内存

时间:2020-12-13 23:03:42

相关推荐

五种内存溢出案例总结:涵盖栈深度溢出 永久代内存溢出 本地方法栈溢出 JVM栈内存

大家好,我是冰河~~

相信小伙伴们在平时工作的过程中,或多或少都会遇到一个场景:内存溢出。如果你没有遇到过这个场景,那就说明你是个假的程序员。哈哈,开个玩笑,平时工作过程中,我们确实会遇到这个问题。今天,我就将平时工作过程中遇到的内存溢出情况做个简单的总结,以通俗易懂的代码案例的形式直观的分享给大家。希望能够为小伙伴们带来实质性的帮助。

案例介绍

这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。

接下来,我们就以代码案例的形式来分析各种内存溢出的情况。

定义主类结构

首先,我们创建一个类叫做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对象,堆满了就直接溢出了。

写在最后

如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~

推荐阅读:

《实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!》《从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)》《我用多线程进一步优化了亿级流量电商业务下的海量数据校对系统,性能再次提升了200%!!(全程干货,建议收藏)》《我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)》《我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)》《高并发场景下一种比读写锁更快的锁,看完我彻底折服了!!(建议收藏)》《全网最全性能优化总结!!(冰河吐血整理,建议收藏)》《三天撸完了MyBatis,各位随便问!!(冰河吐血整理,建议收藏)》《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)》《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些核心技能是你必须要掌握的!完整学习路线!!(建议收藏)》《奉劝那些刚参加工作的学弟学妹们:这些计算机与操作系统基础知识越早知道越好!万字长文太顶了!!(建议收藏)》《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)》《毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?(建议收藏)》《我入侵了隔壁妹子的Wifi,发现。。。(全程实战干货,建议收藏)》《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》《清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!》《7.3万字肝爆Java8新特性,我不信你能看完!(建议收藏)》《在业务高峰期拔掉服务器电源是一种怎样的体验?》《全网最全Linux命令总结!!(史上最全,建议收藏)》《用Python写了个工具,完美破解了MySQL!!(建议收藏)》《SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)》《MySQL 8中新增的这三大索引,直接让MySQL起飞了,你竟然还不知道!!(建议收藏)》《撸完Spring源码,我开源了这个分布式缓存框架!!(建议收藏)》《亿级流量高并发秒杀系统商品“超卖”了,只因使用的JDK同步容器中存在这两个巨大的坑!!(踩坑实录,建议收藏)》《奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)》《公司的报表工具太难用,我三天撸了个Excel工具,运营小姐姐直呼太好用了,现已开源!!(建议收藏)》《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程核心技能是你必须要掌握的!!(建议收藏)》《阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)》《Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)》

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~

👇🏻 搜索下方 公众号 关注我👇🏻

五种内存溢出案例总结:涵盖栈深度溢出 永久代内存溢出 本地方法栈溢出 JVM栈内存溢出和堆溢出

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。