From c9ed26dd985460b0b7e9771bc9be71895465cb10 Mon Sep 17 00:00:00 2001 From: Ruanhui <32773751+frostruan@users.noreply.github.com> Date: Wed, 23 Nov 2022 20:09:41 +0800 Subject: [PATCH] HBASE-27445 fix the result of DirectMemoryUtils#getDirectMemorySize (#4846) Co-authored-by: huiruan Signed-off-by: Duo Zhang (cherry picked from commit 2f4758ee592959ee5ddd646a6769bb81a781d610) --- .../hadoop/hbase/util/DirectMemoryUtils.java | 36 +++---------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java index c0a9685d13e..082796b4a15 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/DirectMemoryUtils.java @@ -18,12 +18,9 @@ package org.apache.hadoop.hbase.util; import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; -import java.util.List; -import java.util.Locale; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; @@ -37,6 +34,7 @@ import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; import org.apache.hbase.thirdparty.io.netty.buffer.ByteBufAllocatorMetric; import org.apache.hbase.thirdparty.io.netty.buffer.ByteBufAllocatorMetricProvider; import org.apache.hbase.thirdparty.io.netty.buffer.PooledByteBufAllocator; +import org.apache.hbase.thirdparty.io.netty.util.internal.PlatformDependent; /** * Utilities for interacting with and monitoring DirectByteBuffer allocations. @@ -49,6 +47,7 @@ public class DirectMemoryUtils { private static final MBeanServer BEAN_SERVER; private static final ObjectName NIO_DIRECT_POOL; private static final boolean HAS_MEMORY_USED_ATTRIBUTE; + private static final long MAX_DIRECT_MEMORY = PlatformDependent.estimateMaxDirectMemory(); static { // initialize singletons. Only maintain a reference to the MBeanServer if @@ -77,36 +76,9 @@ public class DirectMemoryUtils { HAS_MEMORY_USED_ATTRIBUTE = a != null; } - /** - * @return the setting of -XX:MaxDirectMemorySize as a long. Returns 0 if -XX:MaxDirectMemorySize - * is not set. - */ + /** Returns the direct memory limit of the current progress */ public static long getDirectMemorySize() { - RuntimeMXBean runtimemxBean = ManagementFactory.getRuntimeMXBean(); - List arguments = runtimemxBean.getInputArguments(); - long multiplier = 1; // for the byte case. - for (String s : arguments) { - if (s.contains("-XX:MaxDirectMemorySize=")) { - String memSize = s.toLowerCase(Locale.ROOT).replace("-xx:maxdirectmemorysize=", "").trim(); - - if (memSize.contains("k")) { - multiplier = 1024; - } - - else if (memSize.contains("m")) { - multiplier = 1048576; - } - - else if (memSize.contains("g")) { - multiplier = 1073741824; - } - memSize = memSize.replaceAll("[^\\d]", ""); - - long retValue = Long.parseLong(memSize); - return retValue * multiplier; - } - } - return 0; + return MAX_DIRECT_MEMORY; } /** Returns the current amount of direct memory used. */