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

书上P39

1. 堆内存溢出

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

/**
* 堆内存溢出demo
* VM Options: -Xms6m -Xmx6m
*/
public class HeapOOM {
static class OOMObejct { } public static void main(String[] args) {
List<OOMObejct> 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);
}
}
}

  

Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)的更多相关文章

  1. JVM:Java常见内存溢出异常分析

    转载自:http://www.importnew.com/14604.html Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆 ...

  2. Java常见内存溢出异常分析(OutOfMemoryError)

    原文转载自:http://my.oschina.net/sunchp/blog/369412 1.背景知识 1).JVM体系结构 2).JVM运行时数据区 JVM内存结构的相关可以参考: http:/ ...

  3. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  4. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  5. JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

    套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...

  6. Java内存溢出异常(上)

    上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域 ...

  7. 第2章—Java内存区域与内存溢出异常

    2.1 概述 总结:本章将从概念上介绍 Java 虚拟机内存的各个区域,讲解这些区域的作用.服务对象以及其中可能产生的问题. 2.2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把 ...

  8. OutOfMemory相关问题(内存溢出异常OOM)

    OutOfMemory(内存溢出异常OOM) java.lang.OutOfMemoryError :Thrown when the Java Virtual Machine cannot alloc ...

  9. 深入理解java虚拟机系列(一):java内存区域与内存溢出异常

    文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...

随机推荐

  1. SpringMVC归纳-1(model数据模型与重定向传参技术)

    要点: model是一个Map结构的数据模型,能重定向时传递数据(拼接URL),但不安全,主要用于渲染前端页面,配合Thymeleaf填充html里面里设置好的参数. @RequestParam用来获 ...

  2. golang语言示例

    package main import "fmt" /* my first programmer in go */ func fib(n int) int{ if n<2{ ...

  3. Aspnet mvc移除WebFormViewEngine

    为了提高mvc的速度,在Global.asax中移除WebFormViewEngine protected void Application_Start() { RemoveWebFormEngine ...

  4. SSH服务与tcp wrappers实验

    SSH服务与tcp wrappers实验 实验环境: 一台linux(ssh client) 一台linux(ssh server) 实验步骤: 1.配置IP,测试连通性 2.在客户端创建用户yuzl ...

  5. windows PHP 安装 redis 外加扩展

    前置条件:为php7.2搭建redis扩展的前提是在本机上已经成功搭建好php的运行环境,我的电脑的运行环境时 apache2.4+mysql5.5+php7.2. 操作系统为64位,编译环境为Mic ...

  6. 解决Editor.md通过代码块原样输出Emoji被强制解析问题

    Editor.md是一款优秀的开源Markdown 编辑器,在使用中遇到的一些问题和功能改进分享给需要的伙伴. 项目地址 https://github.com/pandao/editor.md 问题 ...

  7. 测试面试话题8:测试人员如何让开发少写bug?

    在测试过程中和不同开发合作,往往会发现一些bug都是大多数开发人员常出现的错误,为了帮助开发人员,也减少测试的重复工作量,非常有必要将以往出现的bug做整理,分析原因,让开发知道这些bug, 避免再次 ...

  8. 《Python 数据科学实践指南》读书笔记

    文章提纲 全书总评 C01.Python 介绍 Python 版本 Python 解释器 Python 之禅 C02.Python 基础知识 基础知识 流程控制: 函数及异常 函数: 异常 字符串 获 ...

  9. myeclipse新建javaweb项目,并部署到tomcat

    myeclipse使用的版本: 新建web项目: File-->New-->Web Project,输入项目名称,选择J2EE规范. 完成后: JRE System Library是只要做 ...

  10. ios之库Protobuf的使用

    https://blog.csdn.net/dangbai01_/article/details/81099001 (1)Protobuf是什么? Protobuf 即 google protocol ...