写在前面

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

案例介绍

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

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

定义主类结构

首先,我们创建一个类叫做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,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!

写在最后

如果你觉得冰河写得还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

内存溢出案例_「性能优化」纳尼?内存又溢出了?是时候总结一波了相关推荐

  1. 「性能优化」首屏时间从12.67s到1.06s,我是如何做到的?

    --本文是对之前同名文章的修正,将所有webpack3的内容更新为webpack4,以及加入了笔者近期在公司工作中学习到的自动化思想,对文章内容作了进一步提升. 0.引言 作为互联网项目,最重要的便是 ...

  2. android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总

    线程调度与线程调度模型 任意时刻,只有一个线程占用 CPU,处于运行状态.而多线程并发执行就是轮流获取 CPU 执行权. 分时调用模型 轮流获取 CPU 执行权,均分 CPU 执行时间. 抢占式调度模 ...

  3. rdd数据存内存 数据量_「大数据」(七十七) Spark之IO机制

    [导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[77]篇文章,欢迎阅读和收藏] 1 基本概念 与传统的 IO 相比, Spark IO 有很大区别.传统的数据存在单个计算 ...

  4. 「性能优化系列」APP内存优化理论与实践

    当一个应用同时运行越来越多的任务以及复杂的业务,Android系统的内存管理机制已经无法满足内存的释放与回收,为了应用的稳定性与性能,去控制内存的创建和回收就成为了一个重要的命题. 本篇文章主要涉及内 ...

  5. 三星oneui主屏幕费电_都 9012 年了,三星系统还「负优化」吗?

    近日,三星正式向国内 Galaxy S9 系列.Note9 系列推送了 Android 9 正式版.此次除了系统版本的重大升级外,三星还为用户带来全新设计的用户界面:One UI. 在宣传中,三星称 ...

  6. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

    欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我csnd博客 也欢迎关注公 众 号[Ccww笔记],原创 ...

  7. 多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化

    多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化 介绍 通常乳腺肿块的检测基于双视图乳腺摄影,医生在阅片是会将所有可用视图的信息组合在一起,他们比较MLO和CC视图,寻找不对称性并评估相对于先前 ...

  8. big sur 虚拟机 网络_推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题...

    欢迎关注公众号[Ccww技术博客],原创技术文章第一时间推出 一. JVM内存区域的划分 1.1  java虚拟机运行时数据区 java虚拟机运行时数据区分布图: JVM栈(Java Virtual ...

  9. go list指针_「GCTT 出品」Go 语言机制之内存剖析

    前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针.栈.堆.逃逸分析和值/指针传递.这是第三篇,主要介绍堆和逃逸分析.(译者注:这一篇可 ...

最新文章

  1. java coverage exclude使用
  2. 学python人工智能需要多久_人工智能Python开发怎么学才能最快入门
  3. 一种新的在线学习的方法:能够克服单人多任务学习的困难!
  4. BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
  5. 中国代工厂的困惑:把大牌t恤卖到99块3件,还会有人买吗?
  6. Chrome谷歌浏览器新功能 删除主题更方便
  7. SysUtils.StrLCat
  8. 做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码
  9. python为运行为何出现乱码_我的python写入文件正常,打开后却是乱码格式为什么?...
  10. ConvMF论文解读
  11. 实战总结的7个C程序,好东西不私藏
  12. 双目测距原理 matlab,双目测距的基本原理
  13. drop_caches 释放哪些
  14. 证券公司信息化4_最核心的IT系统是什么?柜台系统的两个主要功能?一个交易过程是怎样的?
  15. win7工作组计算机无法连接打印机,win7无法访问共享打印机怎么解决
  16. 狼的故事11:以牙还牙
  17. 最强Python编程神器,真香!
  18. Springboot359的医院病历管理系统
  19. 六:分布式架构存储设计
  20. 【周志华机器学习】绪论

热门文章

  1. 批量搜索php文件,php文件批量下载
  2. 大疆云台和华为P30_大疆灵眸手机云台3软件升级 完美支持Mate30系列
  3. android中获取mac地址8.0,华为Mate10手机emui8.0系统怎么查看IP地址和mac地址?
  4. 强制history不记住敏感命令的方法
  5. 科技助力创业升级,看新零售无人超市如何突围?
  6. IEEE 2030.5智能逆变器实施指南(4)
  7. ML之CatboostC:基于titanic泰坦尼克数据集利用catboost算法实现二分类
  8. 2020年安全简报(2月)
  9. 桌面上我的计算机打不开怎么回事,双击我的电脑打不开怎么办,?
  10. Django连接使用SQL Server数据库(windows版)