-XX:MaxDirectMemorySize

news/2024/11/23 3:06:19/
-XX:MaxDirectMemorySize
最大堆外内存大小,此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后就触发Full GC
首先可以在jdk文档中找到:关于MaxDirectMemorySize内存的描述:
Sets the maximum total size (in bytes) of the New I/O (the java.nio package) direct-buffer allocations.

Append the letter k or K to indicate kilobytes, m or M to indicate megabytes, g or G to indicate gigabytes.

By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct-buffer allocations automatically.
The following examples illustrate how to set the NIO size to 1024 KB in different units:
-XX:MaxDirectMemorySize=1m
-XX:MaxDirectMemorySize=1024k
-XX:MaxDirectMemorySize=1048576
参考
关于JDK8中最大堆外内存大小MaxDirectMemorySize

在这里插入图片描述

ByteBuffer(字节缓冲区)分类

heap ByteBuffer -> -XX:Xmx
一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收,
direct ByteBuffer -> -XX:MaxDirectMemorySize
一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况。
JVM堆内存大小可以通过-Xmx来设置
direct ByteBuffer可以通过-XX:MaxDirectMemorySize来设置
没有配置MaxDirectMemorySize的,默认MaxDirectMemorySize的大小即等于-Xmx
用JDK8的一定要配置:-Xms -Xmx -XX:MaxDirectMemorySize,【Xmx + MaxDirectMemorySize】的值不能超过docker的最大内存,不然docker内存占满了会被oomkill掉;
参考
JVM参数之MaxDirectMemorySize

在这里插入图片描述

启动VM options

-Xmx200m
-Xms50m
-XX:+PrintCommandLineFlags
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
--add-opens java.base/jdk.internal.access=ALL-UNNAMED

在这里插入图片描述

背景了解

// 提供对缓冲区使用情况信息的访问。
public interface BufferPool {String getName();long getCount();long getTotalCapacity();long getMemoryUsed();
}
// The management interface for a buffer pool
public interface BufferPoolMXBean extends PlatformManagedObject {	
// The name of this buffer pool
String getName();	// An estimate of the number of buffers in this pool
long getCount();	// An estimate of the total capacity of the buffers in this pool in bytes
long getTotalCapacity(); // An estimate of the memory that the JVM is using for this buffer pool in bytes, 
// or -1L if an estimate of the memory usage is not available
long getMemoryUsed(); 

练习代码

public class MaxDirectMemorySize {public static void main(String[] args) {printJVMRuntime();printDirectMemory();System.out.println("分配25M本地字节缓冲区 " + ByteBuffer.allocateDirect(25 * 1024 * 1024));System.out.println("创建10M对象 " + new byte[10 * 1024 * 1024]);printJVMRuntime();printDirectMemory();System.out.println("分配25M本地字节缓冲区 " + ByteBuffer.allocateDirect(25 * 1024 * 1024));System.out.println("创建10M对象 " + new byte[10 * 1024 * 1024]);printJVMRuntime();printDirectMemory();}private static void printJVMRuntime() {System.out.println("java虚拟机从操纵系统那里挖到的最大的内存   maxMemory " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");System.out.println("java虚拟机已经从操作系统那里挖过来的内存   totalMemory : " + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");System.out.println("java虚拟机从操纵系统挖过来还没用上的内存   freeMemory : " + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "M");}private static void printDirectMemory() {System.out.println("the maximum allocatable direct buffer memory: " + VM.maxDirectMemory() / 1024 / 1024 + "M");System.out.println("BufferPoolMXBean.Name: " + getDirectBufferPoolMBean().getName());System.out.println("BufferPoolMXBean.Count: " + getDirectBufferPoolMBean().getCount());System.out.println("BufferPoolMXBean.TotalCapacity: " + getDirectBufferPoolMBean().getTotalCapacity() / 1024 / 1024 + "M");System.out.println("BufferPoolMXBean.MemoryUsed: " + getDirectBufferPoolMBean().getMemoryUsed() / 1024 / 1024 + "M");System.out.println("BufferPool.Name: " + getNioBufferPool().getName());System.out.println("BufferPool.Count: " + getNioBufferPool().getCount());System.out.println("BufferPool.TotalCapacity: " + getNioBufferPool().getTotalCapacity() / 1024 / 1024 + "M");System.out.println("BufferPool.MemoryUsed: " + getNioBufferPool().getMemoryUsed() / 1024 / 1024 + "M");}public static BufferPoolMXBean getDirectBufferPoolMBean() {return ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class).stream().filter(e -> e.getName().equals("direct")).findFirst().orElseThrow();}public static VM.BufferPool getNioBufferPool() {return SharedSecrets.getJavaNioAccess().getDirectBufferPool();}
}

结果分析

-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=13 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=52428800 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=209715200 -XX:MinHeapSize=52428800 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java虚拟机从操纵系统那里挖到的最大的内存   maxMemory 200M
java虚拟机已经从操作系统那里挖过来的内存   totalMemory : 50M
java虚拟机从操纵系统挖过来还没用上的内存   freeMemory : 45Mthe maximum allocatable direct buffer memory: 200MBufferPoolMXBean.Name: direct
BufferPoolMXBean.Count: 1
BufferPoolMXBean.TotalCapacity: 0M
BufferPoolMXBean.MemoryUsed: 0MBufferPool.Name: direct
BufferPool.Count: 1
BufferPool.TotalCapacity: 0M
BufferPool.MemoryUsed: 0M分配25M本地字节缓冲区 java.nio.DirectByteBuffer[pos=0 lim=26214400 cap=26214400]
创建10M对象 [B@5f4da5c3java虚拟机从操纵系统那里挖到的最大的内存   maxMemory 200M
java虚拟机已经从操作系统那里挖过来的内存   totalMemory : 50M
java虚拟机从操纵系统挖过来还没用上的内存   freeMemory : 33Mthe maximum allocatable direct buffer memory: 200MBufferPoolMXBean.Name: direct
BufferPoolMXBean.Count: 2
BufferPoolMXBean.TotalCapacity: 25M
BufferPoolMXBean.MemoryUsed: 25MBufferPool.Name: direct
BufferPool.Count: 2
BufferPool.TotalCapacity: 25M
BufferPool.MemoryUsed: 25M分配25M本地字节缓冲区 java.nio.DirectByteBuffer[pos=0 lim=26214400 cap=26214400]
创建10M对象 [B@443b7951java虚拟机从操纵系统那里挖到的最大的内存   maxMemory 200M
java虚拟机已经从操作系统那里挖过来的内存   totalMemory : 50M
java虚拟机从操纵系统挖过来还没用上的内存   freeMemory : 22Mthe maximum allocatable direct buffer memory: 200MBufferPoolMXBean.Name: direct
BufferPoolMXBean.Count: 3
BufferPoolMXBean.TotalCapacity: 50M
BufferPoolMXBean.MemoryUsed: 50MBufferPool.Name: direct
BufferPool.Count: 3
BufferPool.TotalCapacity: 50M
BufferPool.MemoryUsed: 50M

http://www.ppmy.cn/news/800088.html

相关文章

有多少苹果可用来分赃

有5个人偷了一堆苹果, 准备在第二天分赃。 晚上,有一人出来,把所有菜果分成5份, 但是多了一个,他顺手把这个苹果扔给树上的猴,自己先拿1/5 藏了起来。结果其他四人也都是这么想的,都如第一个人一…

CQNKP5455 苹果采摘

问题描述 又到了苹果成熟的季节。何老板的果园有n棵苹果树排成一排,其中第i棵树上有A[i]公斤苹果。 何老板有一辆卡车,最多能够运载m公斤水果。 何老板贪图方便,打算选连续一段果树采摘,如果选的这一段果树的苹果数量恰好为m公斤&…

小明摘苹果

试题描述 有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,小明身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设小明会走过每一棵苹果树)&#xff…

p5703_苹果采购(深基2.例5)

p5703_苹果采购(深基2.例5) Description 现在需要采购一些苹果,每名同学都可以分到固定数量的苹果,并且已经知道了同学的数量,请问需要采购多少个苹果? Input 输入两个不超过 1 0 9 10^9 109正整数,分别表示每人分到的…

P1293 放苹果

题目描述 小明刚放学回家,老妈就吩咐他:马上有客人要来,赶快把苹果洗了放到盘子里去。小明要把 m 个同样的苹果放到 n 个同样的盘子里,允许有的盘子空着不放,有多少种不同的 分法。5,1,1 与 1,5,1 是同一种放法。 输入…

苹果采购

题目描述 现在需要采购一些苹果,每名同学都可以分到固定数量的苹果,并且已经知道了同学的数量,请问需要采购多少个苹果? 输入格式 共一行,两个正整数a,b,分别表示每人分到的数量和同学的人数。 输出格式…

放苹果-C语言

三、放苹果 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入描述: 每行均包含…