关于JVM直接内存触发Full GC
今天在研究JVM的直接内存溢出时发现直接内存和堆内存一样,在直接内存快满时会触发full gc,full gc会将未被引用的对象及其指向的直接内存释放掉,如下为测试代码:
package test.oom;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* VM args: -XX:+PrintGCDetails -XX:MaxDirectMemorySize=500M
* @author TZ0643
*
*/
public class DirectMemoryOOM {
private static final int _1MB = 1024 * 1024 * 300;
public static void main(String[] args) throws Exception {
int count = 0;
List<ByteBuffer> bufs = new ArrayList<ByteBuffer>();
while(true) {
count++;
System.out.println("count=" + count);
Thread.sleep(10000);
System.out.println("allocate direct.");
ByteBuffer buf = ByteBuffer.allocateDirect(_1MB);
// 将引用加入集合中防止被GC回收导致直接内存被释放
// bufs.add(buf);
}
}
}
如下为执行日志:
count=1
allocate direct. count=2 allocate direct. [GC [PSYoungGen: 655K->536K(18944K)] 655K->536K(61440K), 0.0046150 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC [PSYoungGen: 536K->0K(18944K)] [ParOldGen: 0K->479K(42496K)] 536K->479K(61440K) [PSPermGen: 2548K->2547K(21504K)], 0.0184197 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] Exception in thread "main" Heap java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:658) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306) at test.oom.DirectMemoryOOM.main(DirectMemoryOOM.java:27) PSYoungGen total 18944K, used 983K [0x00000000eb280000, 0x00000000ec780000, 0x0000000100000000) eden space 16384K, 6% used [0x00000000eb280000,0x00000000eb375d18,0x00000000ec280000)
当程序在执行第一次的时候内存为300多M,当buf不添加到list集合中时,不会出现OOM,JVM每次都释放直接内存;
当buf添加到list中,则出现OOM,由于buf被引用,无法被full gc回收,导致直接内存为600M,而最大直接内存为500M,出现OOM
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Hive安装部署及简单测试 网页《一》
- Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》
- Python - lambda函数
- Oracle 基础学习笔记
- 算法【最大子序列问题】
- 【算法、递归回溯解决数独】
- Anaconda使用命令
- 最大连续子数组
- markdown编辑器实现代码高亮
- LeetCode - 198 简单动态规划 打家劫舍
- Jaskson精讲第7篇-JsonTypeInfo注解在类继承关系下的使用
- 《剑指Offer 1.二维数组中的查找》2019-03-25
- Elasticsearch:Dynamic mapping
- 设计模式《单例设计模式》
- 《0-1 背包问题》