Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
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虚拟机》学习笔记及个人理解(三)的更多相关文章
- JVM:Java常见内存溢出异常分析
转载自:http://www.importnew.com/14604.html Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆 ...
- Java常见内存溢出异常分析(OutOfMemoryError)
原文转载自:http://my.oschina.net/sunchp/blog/369412 1.背景知识 1).JVM体系结构 2).JVM运行时数据区 JVM内存结构的相关可以参考: http:/ ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...
- Java内存溢出异常(上)
上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域 ...
- 第2章—Java内存区域与内存溢出异常
2.1 概述 总结:本章将从概念上介绍 Java 虚拟机内存的各个区域,讲解这些区域的作用.服务对象以及其中可能产生的问题. 2.2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把 ...
- OutOfMemory相关问题(内存溢出异常OOM)
OutOfMemory(内存溢出异常OOM) java.lang.OutOfMemoryError :Thrown when the Java Virtual Machine cannot alloc ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
随机推荐
- PM过程能力成熟度3级
2级PM已经可以把项目管理起来了.如果这时候,企业只有一个PM,那这种程度的管理,只要逐渐深化,就可以一直维持下去. 然鹅,现实总是复杂很多... 公司会在PM建立2级的过程管理后,提高所有项目的可视 ...
- Jalor 5学习心得
jalor5是一套功能强大的框架,该框架集成了spring.mybatis.cxf.日志.异常等组件,和其它未提及的部分组件,如消息组件. 它还自带了权限管理,内容管理,国际化等功能,该框架在项目开发 ...
- about-php
鉴于本人收集的php资料多,感觉查询起来不怎么方便.特意在github上建立了一个分支:about-php 主要是介绍围绕php的相关资料,包括php入门知识,php框架,开发工具,php项目,php ...
- 如何查看linux中文件打开情况
前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. linux下有哪些文件 在介绍lsof命 ...
- 试试Linux下的ip命令,ifconfig已经过时了
linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- Ubuntu server 16.04的安装 以及配置(服务器版)
1.在电脑上下载最新版本的Ubuntu服务器ISO映像,刻录到CD或创建一个可启动的USB盘. 2.视情况而定,进入到服务器的boot界面,把cd或者usb设置为启动第一项 3.开始安装 1)Ub ...
- 毕业设计(1)基于MicroPython的大棚监测控制系统的程序设计与模型设计
智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”.除了精准感知.控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子 ...
- 云计算openstack共享组件(1)——时间同步服务ntp
一.标准时间讲解 地球分为东西十二个区域,共计 24 个时区 格林威治作为全球标准时间即 (GMT 时间 ),东时区以格林威治时区进行加,而西时区则为减. 地球的轨道并非正圆,在加上自转速度逐年递减, ...
- Hive基础知识
一.产生背景 1.MapReudce编程繁琐,需要编写大量的代码 2.HDFS中存放的都是文件,在HDFS中没有Scheme的概念,无法用SQL进行快速的查询. 二.Hive的概念 Hive是基于Ha ...
- Jeecg-Boot前后端分离版
Jeecg-Boot前后端分离版http://www.jeecg.org/forum.php?gid=229 Jeecg-Boot 快速开发平台http://boot.jeecg.org/user/l ...