activator.createinstance 需要垃圾回收么_Epsilon:你为什么需要一个不回收内存的垃圾回收器?...

10838bf080ff746df70fae068b38c9d8.png

JDK 11中的JEP 318添加了一个名为Epsilon的垃圾回收器实现。Epsilon的特点是只负责分配内存,而不做任何垃圾回收操作。当堆内存空间就不够时,自动触发与OutOfMemoryError相关的处理。一个不回收垃圾的垃圾回收器看起来很蠢,实际上在不少情况下都有着它的妙用。

在下面的代码中,size的大小是10M,在循环中分配100次,相当于要求1000M。如果通过-Xmx256M指定堆内存的最大值是256M,当使用正常的垃圾回收器时,下面的代码运行正常。

public class MemoryAllocation {

  public static void main(String[] args) {
    int size = 10 * 1024 * 1024;
    for (int i = 0; i < 100; i++) {
      int[] data = new int[size];
    }
  }
}

当通过选项-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC使用Epsilon之后,程序运行会抛出OutOfMemoryError错误然后退出。这是因为可用的堆内存不能满足分配的需求。

那我们来看看Epsilon到底有哪些作用?

性能调优

在进行性能调优时,通常的做法是以当前的应用作为基础,运行性能测试之后得到相关的性能数据,以这个数据作为基准(baseline)。接着尝试修改某个参数,再运行同样的性能测试,得到新的性能数据,再与之前得到的基准值进行比较,从而判断该参数对性能的影响。这样做有一个重要的前提,那就是两次测试的结果应该只与这个参数的调整有关。如果有其他变量的存在,就无法建立性能差异与参数值之间的关联关系。而Java应用中的GC操作是不可控的。两次测试中GC操作造成的暂停时间,都会导致结果发生变化,会造成错误的判断。

这就体现出Epsilon的价值。因为Epsilon没有任何GC的动作,就排除了GC操作的干扰。这对性能测试的准确性是大有好处的。

测试内存分配

由于垃圾回收器的存在,大多数时候我们并不关注内存的分配,只是不断的创建对象,而依赖垃圾回收器完成对不使用的对象的回收。所以我们对于应用所分配的内存的上限并没有一个准确的认知。

如果你的应用需要对内存的分配进行限制,比如运行在资源受限的系统上,那么可以使用Epsilon并设置堆内存的最大值。这样可以测试应用是否满足这样的限制。如果不满足,那么应用会直接退出。

耗时短暂的任务

有些应用在设计时就只存在极短的时间。比如,一些定期运行的任务在启动之后只是执行一些简单的操作,然后就马上退出。对于这样的应用,进行GC操作是没有意义的。因为在JVM进程退出之后,它所占用的内存会自动被操作系统回收。可以通过Epsilon来在运行时停止GC操作。这样可以进一步降低任务的执行时间。

要求极低延迟的任务

有些应用对处理延迟有苛刻的要求。由于GC操作带来的暂停,对于这样的应用来说是不能接受的。通过Epsilon可以避免GC操作带来的暂停。这相当于用内存换取执行时间。

以上就是Epsilon的一些使用场景。如果你有类似的需求,Epsilon是一个很好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值