Java 18 如何改进处理大型对象回收的内存碎片问题? -


由于内存集数据结构的限制,Java 的G1堆区域的大小一直限制在 32MB;使用 JDK 18 版本JDK-8275056将把这个限制提高到 512MB。
在垃圾收集期间,G1会从一堆死对象中选择它认为包含大量空白空间的任意区域,并将它们的活动对象移动并压缩到另一个(更小)区域集。不同之处在于 G1 在此集合中释放了哪些内容以供进一步应用程序使用。
通常情况下,对象不能跨越区域:典型的 Java 对象范围在几十个字节,因此可用区域大小的范围(从 1MB 到 32MB)通常不是问题。
如果您的应用程序使用大量大对象,那么这种巨大对象分配的实现选择可能会导致碎片问题。
 JDK 18 版本JDK-8275056是如何克服堆区域大小限制的呢?新的内存集实现不再需要 Java 堆区域和内存集的 1:1 映射。而是1:n 映射:单个堆区域现在可能被多个卡片区域覆盖。由此,解锁了高达 512MB 的可配置堆区域大小(这是一个任意限制),即使使用最大的庞大对象和 Java 堆,也应具有足够的灵活性以避免提到的碎片问题。
详细点击标题