美文网首页
虚拟机实验(五)观测直接内存

虚拟机实验(五)观测直接内存

作者: 杭州痞老板 | 来源:发表于2018-04-18 21:23 被阅读0次

实验代码

/**
* VM Args:-XX:MaxDirectMemorySize=512m
*/
public class GCTest {
   private static final int _1GB=1024*1024*1024;
   public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
       Field unsafeField = Unsafe.class.getDeclaredFields()[0];
       unsafeField.setAccessible(true);
       Unsafe unsafe = (Unsafe)unsafeField.get(null);
       int num=0;
       while(true){
           num++;
           unsafe.allocateMemory(_1GB);
           System.out.println(num);
       }
   }
}

实验结果1: 直接内存不在非堆空间的计算之列

下图可见,当在直接内存中分配了4G的空间之后,jconsole反映的堆外内存仍然只有之前的15m,可见直接内存不在非堆空间的计算之列,而且已有的所有jdk工具都无法去观测到直接内存的大小,理由可想而知:因为这块区域并不是虚拟机管理的内存

实验结果2: 无法去限制直接内存的大小

2.1 -XX:MaxDirectMemorySize 该参数亲测无效 (本机环境jdk1.8
尽管我设置了:-XX:MaxDirectMemorySize=512m 但仍然是在机器的内存用尽之后才报内存溢出,实验是循环了40次,在分配了40GB的空间(用尽了本机子的所有内存)后报OOM异常
所以整个直接内存这块区域是这样的:初始大小为0,你申请多少就分配多少,直至机器的内存耗尽

相关文章

  • 虚拟机实验(五)观测直接内存

    实验代码 实验结果1: 直接内存不在非堆空间的计算之列 下图可见,当在直接内存中分配了4G的空间之后,jconso...

  • 直接内存

    什么是直接内存直接内存就是指:java堆外内存。直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中...

  • 直接内存

    直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用...

  • JVM学习笔记——本机直接内存溢出

    一、JVM直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。在JDK...

  • JVM的内存模型

    内存模型 堆 虚拟机栈 本地方法栈 PC寄存器/程序计数器 方法区 直接内存内存模型,是由Java虚拟机规范制定的...

  • JVM内存结构中有哪些是线程私有的?

    JVM的内存区域结构如下 内存区域大概可分为方法区,堆,虚拟机栈,本地方法栈,程序计数器,还会有直接内存(虚拟机对...

  • JVM入门

    Java虚拟机内存包括: 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存。 ...

  • java直接内存

    直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。但是这部分内存也被频繁的使...

  • Java内存区域与内存溢出异常

      《深入理解Java虚拟机》第2章读书笔记与实验记录。 1、对象创建内存分配方式 指针碰撞: Java堆内存绝对...

  • JVM学习(4)非堆的配置参数

    除了堆内存以外,虚拟机还有一些内存用于方法区,线程栈和直接内存的使用。它们与堆内存是独立的。虽然和堆内存相比,这些...

网友评论

      本文标题:虚拟机实验(五)观测直接内存

      本文链接:https://www.haomeiwen.com/subject/cegskftx.html