Java之——内存溢出案例
来源:互联网 发布:杭州java培训班包住 编辑:程序博客网 时间:2024/06/05 00:58
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78024608
今天,给大家打来一篇有关Java内存溢出的文章,好了,不多说了,我们直接进入主题。
1、定义主类结构
首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。
public class BlowUpJVM { }
2、栈深度溢出
public static void testStackOverFlow(){ BlowUpJVM.testStackOverFlow(); }栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。
3、永久代内存溢出
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动态代理产生的类信息,不会放到永久代中,而是放在堆中。
4、本地方法栈溢出
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个线程,这些线程池都是在本地方法区的,久而久之,本地方法区就溢出了。
5、JVM栈内存溢出
public static void testStackOutOfMemory(){ while (true) { Thread thread = new Thread(new Runnable() { public void run() { while(true){ } } }); thread.start(); } }线程的创建会直接在JVM栈中创建,但是本例子中,没看到内存溢出,主机先挂了,不是JVM挂了,真的是主机挂了,无论在mac还是在windows,都挂了。
温馨提示,这个真的会死机的。
6、堆溢出
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对象,堆满了就直接溢出了。
阅读全文
0 0
- Java之——内存溢出案例
- android内存溢出案例
- JAVA内存溢出之HeapOutOfMemoryDemo
- ElasticSearch——Java 内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- JVM——java 内存区域与内存溢出分析
- Java基础恶补——内存泄露、内存溢出
- Java基础恶补——内存泄露、内存溢出
- 部分笔记—Java内存区域与内存溢出异常
- 读书笔记——《深入理解Java虚拟机》系列之Java内存区域与常见内存溢出异常
- jvm内存管理之java堆溢出
- java内存溢出之持久代
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- Java数据结构之链表
- C++中调用main函数
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Barty's Computer(暴力+hash)
- 自定义配置数据源 DataSource
- Java之——内存溢出案例
- Iterator原理(jdk1.8)
- Java实现选择排序和冒泡排序
- 枚举法填运算符
- Java多线程看我这一篇就足够了
- JavaScript-2-2:DOM(重点),封装类
- 利用DOM实现图书馆管理系统
- 密码锁(3602017秋招真题)
- 详谈Android apk打包:关于APK数字签名详解介绍