博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
阅读量:5021 次
发布时间:2019-06-12

本文共 2586 字,大约阅读时间需要 8 分钟。

Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)

书上P39

1. 堆内存溢出

不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达).

/** * 堆内存溢出demo * VM Options: -Xms6m -Xmx6m */public class HeapOOM {    static class OOMObejct {    }    public static void main(String[] args) {        List
list = new ArrayList<>(); while (true) { list.add(new OOMObejct()); } }}

 会内存溢出, 输出结果如下:

如果是用下面这段代码的话, 是不会内存溢出的. 因为有GC. 每次new 的 Object在下次for循环中都退出了作用域, 虚拟机栈不再持有对象的引用. 所以会被GC掉. 不会溢出.

/** * 堆内存溢出demo * VM Options: -Xms6m -Xmx6m */public class HeapOOM {    static class OOMObejct {    }    public static void main(String[] args) {        while (true) {            new OOMObejct();        }    }}

 visualVM的堆内存图如下:

2. 虚拟机栈溢出

/** * 栈内存溢出demo * VM Options: -Xms6m -Xmx6m */public class StackOverflow {    private int stackDepth;    private void stackLeak() {        stackDepth++;        stackLeak();    }    public static void main(String[] args) {        StackOverflow oom = new StackOverflow();        try {            oom.stackLeak();        } catch (Throwable e) {            System.out.println(oom.stackDepth);            System.err.println(e.toString());        }    }}

 输出结果如下(下面部分结果可能根据机器环境不同而不同):  

3. 创建线程导致的内存溢出

import java.util.concurrent.atomic.AtomicInteger;/** * 创建线程导致的内存溢出demo * VM Options: -Xms6m -Xmx6m */public class CreateThreadOOM {    static AtomicInteger counter = new AtomicInteger(0);    public static void main(String[] args) {        while (true) {            new Thread(() -> {                try {                    System.out.println(counter.incrementAndGet());                    Thread.sleep(Integer.MAX_VALUE);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }).start();        }    }}

 输出结果如下(下面部分结果可能根据机器环境不同而不同): 

4. 直接内存溢出

这段代码我这里没有运行出书上的效果...

书上的意思应该是, 设定了直接内存大小最大为10M后, 继续申请的话, 就会报异常..

在我电脑上, 虽然也设置了MaxDirectMemorySize=10m , 但是这玩意硬生生地申请了10G的虚拟内存也没停下, 最后被操作系统强制停止了.....(运行了几次电脑都快没电了)

import sun.misc.Unsafe;import java.lang.reflect.Field;/** * VM Options: -Xms6m -Xmx6m -XX:MaxDirectMemorySize=10m */public class DirectMemoryOOM {    private static final int _1MB = 1024 * 1014;    public static void main(String[] args) throws IllegalAccessException, InterruptedException {        Field unsafeFile = Unsafe.class.getDeclaredFields()[0];        unsafeFile.setAccessible(true);        Unsafe unsafe = (Unsafe) unsafeFile.get(null);        while (true) {            unsafe.allocateMemory(_1MB);            Thread.sleep(10);        }    }}

  

转载于:https://www.cnblogs.com/noKing/p/9452710.html

你可能感兴趣的文章
ubuntu 16.04 (软件应用)-输入法
查看>>
windos7修复引导扇区
查看>>
Leetcode总结之Backtracking
查看>>
Android开发学习之路-图片颜色获取器开发(1)
查看>>
StackExchange.Redis 官方文档(一) Basics
查看>>
nupkg 之破解 nodejs+electron-packager 打包exe的解包
查看>>
Objective-C 使用 C++类
查看>>
浅谈之高级查询over(partition by)
查看>>
Notes: CRM Analytics–BI from a CRM perspective (2)
查看>>
graphite custom functions
查看>>
列出所有的属性键
查看>>
js获取请求地址后面带的参数
查看>>
[原创]使用java批量修改文件编码(ANSI-->UTF-8)
查看>>
设计模式のCompositePattern(组合模式)----结构模式
查看>>
二进制集合枚举子集
查看>>
磁盘管理
查看>>
SAS学习经验总结分享:篇二—input语句
查看>>
UIImage与UIColor互转
查看>>
RotateAnimation详解
查看>>
系统管理玩玩Windows Azure
查看>>