前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于JVM直接内存触发Full GC

关于JVM直接内存触发Full GC

作者头像
囚兔
发布2018-02-08 10:35:02
2.5K0
发布2018-02-08 10:35:02
举报
文章被收录于专栏:IT杂记IT杂记

今天在研究JVM的直接内存溢出时发现直接内存和堆内存一样,在直接内存快满时会触发full gc,full gc会将未被引用的对象及其指向的直接内存释放掉,如下为测试代码:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档