[性能优化]纳尼?内存不足了吗?现在是总结浪潮的时候了!

案例介绍在这里,我将总结正常工作过程中的内存溢出情况,并以代码案例的形式与您分享。

希望给朋友们带来很大的帮助。

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

定义主类结构首先,我们创建一个名为BlowUpJVM的类,所有案例实验都基于该类。

公共类BlowUpJVM {}堆栈深度溢出public static void testStackOverFlow(){BlowUpJVM.testStackOverFlow();}堆栈是递归递归的,并且没有任何处理,因此虚拟机堆栈会越来越深,而堆栈深度只是溢出。

永久生成内存溢出public static void testPergemOutOfMemory1(){//方法1失败List列表= new ArrayList(); while(true){UUID.randomUUID()。

toString()。

intern());我计划填充String常量池,但是我没想到它会失败。

在JDK1.7之后,常量池被放入堆中并且可以进行垃圾回收。

然后更改方式,使用cglib,使用Class填充旧版本的公共静态无效testPergemOutOfMemory2(){try {} {} {} {} {} {} {} {} {} {}}} {}}增强剂。

增强剂。

=新的Enhancer();增强剂cer。

设置OO ClassM cer。

(错误的); Enhancer.setCallback(new MethodInterceptor(){@重写公共对象拦截(对象obj,方法方法,对象[] args,MethodProxy代理))引发Throwable {return proxy.invokeSuper(obj,args);}}); Enhancer.create();捕获(异常e){e.printStackTrace();虚拟机的内存已成功溢出。

JDK动态代理生成的类会溢出吗?公共静态无效testPergemOutOfMemory3(){while(true){final OOM oom = new OOM(); Proxy.newProxyInstance(oom.getClass()。

getClassLoader(),oom.getClass()。

getInterfaces(),new InvocationHandler(){公共对象invoke(对象代理,方法方法,Object [] args)Throwable Throwable {Object result = method.invoke(oom,args); JDK代理类型,返回}动态结果;内存溢出的原因是,由JDK动态代理生成的类信息不会存储在永久代中,而是存储在堆中。

方法堆栈溢出公共静态无效testNativeMethodOutOfMemory(){int j = 0; while(true){Printer.println(j ++); executors = ExecutorService(+10); int = 0; int ThreadPooli(50); {executors.submit( new Runnable(){public void run(){}});}}}这个原理是不断创建一个线程池,并且每个线程池都会创建10个本地池中的线程。

本地方法区域溢出。

JVM堆栈内存溢出公共静态无效testStackOutOfMemory(){while(true){线程=新线程(新Runnabl e(){public void run(){while(true){}}}); thread.start();}}线程创建将直接在JVM堆栈中创建,但是在此示例中,未看到内存溢出。

主机首先挂起,而不是JVM挂起,无论它是在Mac还是Windows中,它实际上都是主机挂起了。

温馨提醒,这确实会崩溃。

堆溢出公共静态无效testOutOfHeapMemory()列表= new ArrayList(); While(true){StringBuffer B = new StringBuffer();对于(int i = 0; i 10000; i ++){end}} list.add(B);}}继续插入新的堆栈StringBuffer对象,溢出被直接填充。

我特别推荐一种高质量的内容共享架构+算法。

如果您没有关注,则可以长按以关注它:长按以订阅更多令人兴奋的内容▼如果您已了解,请单击以查看,由衷的感谢。

免责声明:本文内容由21ic经授权发布,版权归原作者所有,该平台仅提供信息存储服务。

本文仅代表作者的个人观点,并不代表该平台的立场。

如有任何疑问,请与我们联系,谢谢!