From f716bfd2f78b64f25e2720786f3771379ced7718 Mon Sep 17 00:00:00 2001 From: libin Date: Thu, 9 Nov 2023 15:39:06 +0800 Subject: [PATCH] comfortableCapacity size optimize --- .../protocol/collection/CollectionUtils.java | 7 ++----- .../com/zfoo/protocol/util/MathSafeUtil.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java diff --git a/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java b/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java index 069a430c..29466166 100644 --- a/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java @@ -16,8 +16,8 @@ package com.zfoo.protocol.collection; import com.zfoo.protocol.model.Pair; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.IOUtils; +import com.zfoo.protocol.util.MathSafeUtil; import com.zfoo.protocol.util.StringUtils; -import io.netty.util.internal.MathUtil; import java.util.*; @@ -116,10 +116,7 @@ public abstract class CollectionUtils { * CN: 计算HashMap初始化合适的大小,为了安全必须给初始化的集合一个最大上限,防止反序列化一个不合法的包导致内存突然升高 */ public static int comfortableCapacity(int capacity) { - return MathUtil.safeFindNextPositivePowerOfTwo(capacity); - /* return capacity < 16 - ? (capacity < 8 ? 16 : 32) - : (capacity < 32 ? 64 : Math.min(capacity << 1, IOUtils.BYTES_PER_MB));*/ + return MathSafeUtil.safeFindNextPositivePowerOfTwo(capacity); } public static int capacity(int expectedSize) { diff --git a/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java b/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java new file mode 100644 index 00000000..04120c8d --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java @@ -0,0 +1,19 @@ +package com.zfoo.protocol.util; + +/** + * @author Boone Jack + */ +public class MathSafeUtil { + private MathSafeUtil() { + } + + public static int findNextPositivePowerOfTwo(int value) { + assert value > Integer.MIN_VALUE && value < IOUtils.BYTES_PER_MB; + + return 1 << 32 - Integer.numberOfLeadingZeros(value - 1); + } + + public static int safeFindNextPositivePowerOfTwo(int value) { + return value <= 0 ? 1 : (value >= IOUtils.BYTES_PER_MB ? IOUtils.BYTES_PER_MB : findNextPositivePowerOfTwo(value)); + } +}