驻马店手机网站制作,空间数据云网站,造价师在哪个网站做继续教育,网络推广合作平台JVM社区不断增加新的GC#xff0c;最近又添加了一个新的GC#xff0c;它称为Epsilon #xff0c;是非常特殊的一个。 Epsilon仅分配内存#xff0c;但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途#xff0c;我们将… JVM社区不断增加新的GC最近又添加了一个新的GC它称为Epsilon 是非常特殊的一个。 Epsilon仅分配内存但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途我们将对其进行研究。 可以在哪里使用此灵巧的GC 性能测试 如果您正在开发对延迟要求严格且内存预算有限的解决方案那么此GC可用于测试程序限制。 内存压力测试 想知道您的应用程序提取瞬态内存需求。 如果您要构建一些纯粹的内存中解决方案我会发现这很有用。 基准标记算法。 很多时候我们希望基于对BIGO概念的理解来测试新的酷算法的真实性能但是垃圾收集器会在测试过程中增加噪音。 低垃圾 很多时候我们在算法上进行了一些优化以减少产生的垃圾而像epsilon这样的GC则有助于科学验证优化。 如何启用epsilon GC JVM工程师特别注意不要在生产中默认启用此GC因此要使用此GC我们必须使用以下JVM选项 -XX UnlockExperimentalVMOptions -XX UseEpsilonGC -Xloggc 您可能会想到的一个问题是内存耗尽时会发生什么 JVM将因内存不足错误而停止。 让我们看一些代码来测试GC 如何知道JVM进程中是否使用epsilon Java具有良好的管理API可以查询正在使用的当前GC也可以用来验证不同版本的Java中的默认GC是什么。 public class VerifyCurrentGC { public static void main(String... args) { var gcBeans ManagementFactory.getGarbageCollectorMXBeans(); gcBeans.stream().forEach(gc - { out.println(format( GC Name : %s , gc.getName())); var poolNames gc.getMemoryPoolNames(); if (poolNames ! null ) { List.of(poolNames).forEach(pool - out.println(format( Pool name %s , pool))); } else { out.println( No memory pools for gc.getName()); No memory pools for gc.getName()); } }); } } 使用以下选项运行以上代码 -XX UnlockExperimentalVMOptions -XX UseEpsilonGC VerifyCurrentGC 内存耗尽时代码的行为方式。 我将使用下面的代码来展示新GC的工作方式。 public class MemoryAllocator { public static final int KB 1024 ; static int mbToAllocate Integer.getInteger( mb , 1000 ); public static void main(String[] args) { System.out.println(String.format( Start allocation of %s MBs , mbToAllocate)); for (var i 0 ; i mbToAllocate; i) { var garbage new byte [KB * KB]; } System.out.println( I was Alive after allocation ); } } 使用默认的GC运行以上代码并请求5GB分配不会引起任何问题 java -Xloggc -Dmb 5024 MemoryAllocator 并且它会产生以下输出 [0.016s] [info] [gc]使用G1 [0.041s] [info] [gc]定期GC已禁用 开始分配5024 MB [0.197s] [info] [gc] GC0暂停年轻并发启动G1大量分配116M- 0M254M3.286ms [0.197s] [info] [gc] GC1并发周期 [0.203s] [info] [gc] GC1暂停备注20M- 20M70M4.387ms [0.203s] [info] [gc] GC1暂停清理22M- 22M70M0.043ms [1.600s] [info] [gc] GC397并发周期6.612ms [1.601s] [info] [gc] GC398暂停年轻并发启动G1混合分配52M- 0M117M1.073ms [1.601s] [info] [gc] GC399并发周期 分配后我还活着 [1.606s] [info] [gc] GC399暂停备注35M- 35M117M0.382ms [1.607s] [info] [gc] GC399暂停清理35M- 35M117M0.093ms [1.607s] [info] [gc] GC399并发周期6.062ms 让我们添加一些内存限制 java -XX UnlockExperimentalVMOptions -XX UseEpsilonGC -Xloggc -Xmx1g -Dmb 5024 内存分配器 [0.011s] [info] [gc]可调整大小的堆 从253M开始最大1024M步长128M [0.011s] [info] [gc]使用TLAB分配 最高4096K [0.011s] [info] [gc]启用了弹性TLAB 弹性1.10倍 [0.011s] [info] [gc]启用了弹性TLAB衰减 衰减时间1000ms [0.011s] [info] [gc]使用Epsilon 开始分配5024 MB [0.147s] [info] [gc]堆已保留1024M已提交253M24.77已使用52640K5.02 [0.171s] [info] [gc]堆已保留1024M已承诺253M24.77已使用103M10.10 [0.579s] [info] [gc]堆已保留1024M已落实1021M99.77已使用935M91.35 [0.605s] [info] [gc]堆已使用1024M已承诺1021M99.77已使用987M96.43 由于java.lang.OutOfMemoryError而终止Java堆空间 此特定运行导致OOM错误可以很好地确认1GB之后该程序将崩溃。 真正的多线程程序也具有相同的行为请参考MultiThreadMemoryAllocator.java以获取示例。 单元测试可用于测试此特殊GC的功能。 我认为Epsilon将来会发现更多用例和采用情况这绝对是增加JVM覆盖率的好一步。 所有代码示例均可用Github回购 如果您喜欢该职位则可以在Twitter上关注我 。 翻译自: https://www.javacodegeeks.com/2019/08/jvm-with-no-garbage-collection.html