From c695df770f4e7e1ffddf4d1ecd35ae9e79072f27 Mon Sep 17 00:00:00 2001 From: pizihao <2335715300@qq.com> Date: Mon, 24 Oct 2022 14:06:54 +0800 Subject: [PATCH] fix : add MemoryUtil for get memory info --- .../web/WebThreadPoolRunStateHandler.java | 23 +++--- .../cn/hippo4j/common/toolkit/MemoryUtil.java | 80 +++++++++++++++++++ .../common/toolkit/MemoryUtilTest.java | 44 ++++++++++ .../common/toolkit/http/HttpUtilsTest.java | 4 +- .../state/ThreadPoolRunStateHandler.java | 22 +++-- 5 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java create mode 100644 hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java diff --git a/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java b/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java index 2cee24ef..2727e52c 100644 --- a/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java +++ b/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/WebThreadPoolRunStateHandler.java @@ -19,13 +19,11 @@ package cn.hippo4j.adapter.web; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.common.toolkit.ByteConvertUtil; +import cn.hippo4j.common.toolkit.MemoryUtil; +import cn.hippo4j.common.toolkit.StringUtil; import cn.hippo4j.core.executor.state.AbstractThreadPoolRuntime; import lombok.extern.slf4j.Slf4j; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; - /** * Web thread pool run state handler. */ @@ -34,16 +32,13 @@ public class WebThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { @Override public ThreadPoolRunStateInfo supplement(ThreadPoolRunStateInfo poolRunStateInfo) { - MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); - MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); - long used = heapMemoryUsage.getUsed(); - long max = heapMemoryUsage.getMax(); - String memoryProportion = new StringBuilder() - .append("已分配: ") - .append(ByteConvertUtil.getPrintSize(used)) - .append(" / 最大可用: ") - .append(ByteConvertUtil.getPrintSize(max)) - .toString(); + long used = MemoryUtil.heapMemoryUsed(); + long max = MemoryUtil.heapMemoryMax(); + String memoryProportion = StringUtil.newBuilder( + "已分配: ", + ByteConvertUtil.getPrintSize(used), + " / 最大可用: ", + ByteConvertUtil.getPrintSize(max)); poolRunStateInfo.setCurrentLoad(poolRunStateInfo.getCurrentLoad() + "%"); poolRunStateInfo.setPeakLoad(poolRunStateInfo.getPeakLoad() + "%"); poolRunStateInfo.setMemoryProportion(memoryProportion); diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java b/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java new file mode 100644 index 00000000..c6fc6443 --- /dev/null +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/MemoryUtil.java @@ -0,0 +1,80 @@ +package cn.hippo4j.common.toolkit; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.MemoryUsage; + +/** + * memory util
+ * the obtained information is not invalid, after a long wait, obtain it again + * + * @author liuwenhao + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MemoryUtil { + + static MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); + static MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); + static MemoryUsage noHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage(); + + + /** + * get used memory in heap + * + * @return long bytes + */ + public static long heapMemoryUsed() { + return heapMemoryUsage.getUsed(); + } + + /** + * get max memory in heap + * + * @return long bytes + */ + public static long heapMemoryMax() { + return heapMemoryUsage.getMax(); + } + + + /** + * get free memory in heap + * + * @return long bytes + */ + public static long heapMemoryFree() { + return Math.subtractExact(heapMemoryMax(), heapMemoryUsed()); + } + + /** + * get used memory in no-heap + * + * @return long bytes + */ + public static long noHeapMemoryUsed() { + return noHeapMemoryUsage.getUsed(); + } + + /** + * get max memory in no-heap + * + * @return long bytes + */ + public static long noHeapMemoryMax() { + return noHeapMemoryUsage.getMax(); + } + + + /** + * get free memory in no-heap + * + * @return long bytes + */ + public static long noHeapMemoryFree() { + return Math.subtractExact(noHeapMemoryMax(), noHeapMemoryUsed()); + } + +} diff --git a/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java new file mode 100644 index 00000000..87f8c5fa --- /dev/null +++ b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/MemoryUtilTest.java @@ -0,0 +1,44 @@ +package cn.hippo4j.common.toolkit; + + +import org.junit.Assert; +import org.junit.Test; + +public class MemoryUtilTest { + + @Test + public void heapMemoryUsed() { + long memoryUsed = MemoryUtil.heapMemoryUsed(); + Assert.assertNotEquals(0, memoryUsed); + } + + @Test + public void heapMemoryMax() { + long memoryUsed = MemoryUtil.heapMemoryMax(); + Assert.assertNotEquals(0, memoryUsed); + } + + @Test + public void heapMemoryFree() { + long memoryUsed = MemoryUtil.heapMemoryFree(); + Assert.assertNotEquals(0, memoryUsed); + } + + @Test + public void noHeapMemoryUsed() { + long memoryUsed = MemoryUtil.noHeapMemoryUsed(); + Assert.assertNotEquals(0, memoryUsed); + } + + @Test + public void noHeapMemoryMax() { + long memoryUsed = MemoryUtil.noHeapMemoryMax(); + Assert.assertNotEquals(0, memoryUsed); + } + + @Test + public void noHeapMemoryFree() { + long memoryUsed = MemoryUtil.noHeapMemoryFree(); + Assert.assertNotEquals(0, memoryUsed); + } +} \ No newline at end of file diff --git a/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java index 105228d6..30b2b028 100644 --- a/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java +++ b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java @@ -72,14 +72,14 @@ public class HttpUtilsTest { Assert.assertNotNull(data); } - @Test + @Test(expected = SocketTimeoutException.class) public void testRestApiPostTimeout() { String loginUrl = postUrl + "auth/login"; LoginInfo loginInfo = new LoginInfo(); loginInfo.setPassword("hippo4j"); loginInfo.setUsername("hippo4j"); loginInfo.setRememberMe(1); - Assert.assertThrows(SocketTimeoutException.class, () -> HttpUtil.post(loginUrl, loginInfo, 1, Result.class)); + HttpUtil.post(loginUrl, loginInfo, 1, Result.class); } @Test diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/state/ThreadPoolRunStateHandler.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/state/ThreadPoolRunStateHandler.java index 62b9b1ab..ca9d7eaf 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/state/ThreadPoolRunStateHandler.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/state/ThreadPoolRunStateHandler.java @@ -21,6 +21,8 @@ import cn.hippo4j.common.model.ManyThreadPoolRunStateInfo; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.common.toolkit.BeanUtil; import cn.hippo4j.common.toolkit.ByteConvertUtil; +import cn.hippo4j.common.toolkit.MemoryUtil; +import cn.hippo4j.common.toolkit.StringUtil; import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; import cn.hippo4j.core.executor.DynamicThreadPoolWrapper; import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; @@ -30,9 +32,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.ConfigurableEnvironment; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; import java.util.concurrent.ThreadPoolExecutor; import static cn.hippo4j.core.toolkit.IdentifyUtil.CLIENT_IDENTIFICATION_VALUE; @@ -50,16 +49,13 @@ public class ThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { @Override public ThreadPoolRunStateInfo supplement(ThreadPoolRunStateInfo poolRunStateInfo) { - MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); - MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); - long used = heapMemoryUsage.getUsed(); - long max = heapMemoryUsage.getMax(); - String memoryProportion = new StringBuilder() - .append("已分配: ") - .append(ByteConvertUtil.getPrintSize(used)) - .append(" / 最大可用: ") - .append(ByteConvertUtil.getPrintSize(max)) - .toString(); + long used = MemoryUtil.heapMemoryUsed(); + long max = MemoryUtil.heapMemoryMax(); + String memoryProportion = StringUtil.newBuilder( + "已分配: ", + ByteConvertUtil.getPrintSize(used), + " / 最大可用: ", + ByteConvertUtil.getPrintSize(max)); poolRunStateInfo.setCurrentLoad(poolRunStateInfo.getCurrentLoad() + "%"); poolRunStateInfo.setPeakLoad(poolRunStateInfo.getPeakLoad() + "%"); String ipAddress = hippo4JInetUtils.findFirstNonLoopBackHostInfo().getIpAddress();