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内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
随机推荐
- 【English】五、颜色相关
一.常见颜色 黑色 black 白色 white 蓝色 blue 橙色 orange 黄色 yellow 灰色 gray ...
- SQL Server服务没有自动启动原因案例分析
这个案例是前两天出现的,一直没有时间总结,25号凌晨4点去处理数据库的故障问题.远程连上公司的局域网,psping检查发现服务器的1433端口不通,数据库连接不上,但是主机又能ping通,登录服务器检 ...
- Python3 isdigit()方法
描述 Python isdigit() 方法检测字符串是否只由数字组成. 语法 isdigit()方法语法: str.isdigit() 参数 无. 返回值 如果字符串只包含数字则返回 True 否则 ...
- ORM(二)常用字段小记
常用字段类型: AutoField:字段自增,多用于ID主键字段,每个表中只能有一个AutoField字段类型. id = models.AutoField(primary_key=True) # 设 ...
- Linux学习历程——Centos 7 账户管理命令(用户篇)useradd usermod userdel
一.命令介绍 useradd 用于创建新的用户 usermod 用于修改用户属性 userdel 用于删除用户 -------------------------------- ...
- 利用Sonar定制自定义扫描规则
上有3种方法可以自定义soanr的代码校验规则: 直接在sonar的web接口中增加XPath规则: 通过插件的功能来增加自定义规则,比如checkstyle,pmd等插件是允许自定义规则的: 通 ...
- VMware Tools 继续运行脚本未能在虚拟机中成功运行。
安装VMware Tools之后,Ubuntu弹出以下警告 sudo apt-get autoremove open-vm-tools 也可以执行这个命令(如果vmware-uninstall-too ...
- 第一章 初识 MyBatis
概念:优秀持久层框架:实体类和SQL语句之间建立映射关系 与hibernate区别 :自动生成sql语句,并且建立实体类和数据表的映射. MyBatis基本要素:核心对象 核心配置文件 S ...
- 虚拟机网络连接方式导致的p地址为10.0.2.*的问题
全世界都知道通过 ifconfig 命令查看本机ip地址,我当然希望安装的虚拟机和当前局域网的其他机器一样内网ip为192.168.1.*,如下图所示: 而当我执行该命令时,实际情况却是这样的: 解决 ...
- springboot使用RestHighLevelClient批量插入
1.引入maven(注意版本要一致) <dependency> <groupId>org.springframework.boot</groupId> <ar ...