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内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
随机推荐
- SpringMVC归纳-1(model数据模型与重定向传参技术)
要点: model是一个Map结构的数据模型,能重定向时传递数据(拼接URL),但不安全,主要用于渲染前端页面,配合Thymeleaf填充html里面里设置好的参数. @RequestParam用来获 ...
- golang语言示例
package main import "fmt" /* my first programmer in go */ func fib(n int) int{ if n<2{ ...
- Aspnet mvc移除WebFormViewEngine
为了提高mvc的速度,在Global.asax中移除WebFormViewEngine protected void Application_Start() { RemoveWebFormEngine ...
- SSH服务与tcp wrappers实验
SSH服务与tcp wrappers实验 实验环境: 一台linux(ssh client) 一台linux(ssh server) 实验步骤: 1.配置IP,测试连通性 2.在客户端创建用户yuzl ...
- windows PHP 安装 redis 外加扩展
前置条件:为php7.2搭建redis扩展的前提是在本机上已经成功搭建好php的运行环境,我的电脑的运行环境时 apache2.4+mysql5.5+php7.2. 操作系统为64位,编译环境为Mic ...
- 解决Editor.md通过代码块原样输出Emoji被强制解析问题
Editor.md是一款优秀的开源Markdown 编辑器,在使用中遇到的一些问题和功能改进分享给需要的伙伴. 项目地址 https://github.com/pandao/editor.md 问题 ...
- 测试面试话题8:测试人员如何让开发少写bug?
在测试过程中和不同开发合作,往往会发现一些bug都是大多数开发人员常出现的错误,为了帮助开发人员,也减少测试的重复工作量,非常有必要将以往出现的bug做整理,分析原因,让开发知道这些bug, 避免再次 ...
- 《Python 数据科学实践指南》读书笔记
文章提纲 全书总评 C01.Python 介绍 Python 版本 Python 解释器 Python 之禅 C02.Python 基础知识 基础知识 流程控制: 函数及异常 函数: 异常 字符串 获 ...
- myeclipse新建javaweb项目,并部署到tomcat
myeclipse使用的版本: 新建web项目: File-->New-->Web Project,输入项目名称,选择J2EE规范. 完成后: JRE System Library是只要做 ...
- ios之库Protobuf的使用
https://blog.csdn.net/dangbai01_/article/details/81099001 (1)Protobuf是什么? Protobuf 即 google protocol ...