From 4bf45e130b8db1ed1f5838512ebb701f178afb33 Mon Sep 17 00:00:00 2001 From: godotg Date: Sat, 24 Sep 2022 20:24:54 +0800 Subject: [PATCH] =?UTF-8?q?perf[array]:=20=E6=95=B0=E7=BB=84=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E9=95=BF=E5=BA=A6=E7=9A=84=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E9=99=90=E5=88=B6=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E5=BC=82=E5=B8=B8=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=86=85=E5=AD=98=E7=AA=81=E7=84=B6=E5=8D=87=E9=AB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../protocol/collection/CollectionUtils.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) 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 4707e357..6ece1398 100644 --- a/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java @@ -16,6 +16,8 @@ package com.zfoo.protocol.collection; import com.zfoo.protocol.collection.model.NaturalComparator; import com.zfoo.protocol.model.Pair; import com.zfoo.protocol.util.AssertionUtils; +import com.zfoo.protocol.util.IOUtils; +import com.zfoo.protocol.util.StringUtils; import java.util.*; @@ -90,10 +92,22 @@ public abstract class CollectionUtils { /** - * 计算HashMap初始化合适的大小 + * 数组初始化长度的安全上限限制,防止反序列化异常导致内存突然升高 */ - public static int comfortableCapacity(int expectedSize) { - return expectedSize < 8 ? 16 : expectedSize << 1; + public static int comfortableLength(int length) { + if (length >= IOUtils.BYTES_PER_MB) { + throw new ArrayStoreException(StringUtils.format("新建数组的长度[{}]超过设置的安全范围[{}]", length, IOUtils.BYTES_PER_MB)); + } + return length; + } + + /** + * 计算List和HashMap初始化合适的大小,为了安全必须给初始化的集合一个最大上限,防止反序列化一个不合法的包导致内存突然升高 + */ + public static int comfortableCapacity(int capacity) { + return capacity < 16 + ? (capacity < 8 ? 16 : 32) + : (capacity < 32 ? 64 : Math.min(capacity << 1, IOUtils.BYTES_PER_MB)); } // ----------------------------------归并排序----------------------------------