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是一个很好的选择。

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

  1. android垃圾软件还多吗,手机变慢是因为软件产生的垃圾过多吗?

    很多人买了手机之后,感觉运行还算可以.可是,使用一段时间之后,手机运行速度就会变慢,而且随着使用时间的延长,手机运行越来越慢,还会卡顿,弄得人们心里很烦,以为软件产生的垃圾过多,又不能卸掉其中的软件, ...

  2. 想知道垃圾回收暂停的过程中发生了什么吗?查查垃圾回收日志就知道了!

    \ 关键点 \ 垃圾回收日志中包括着一些关键性能指标: \ 要做一次正确的垃圾回收分析需要收集许多数据,所以好的工具是非常必要的: \ 除了垃圾回收之外还有很多事件都可能会让应用程序暂停: \ 让你的 ...

  3. createinstance.java_C# Activator.CreateInstance()方法使用

    本文来自:http://blog.csdn.net/jaydawson/article/details/5539438 C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.Cr ...

  4. java栈的回收_JAVA的堆栈和内存、垃圾回收解说

    1.有关java健壮性特点的真相 很多书上都说java健壮性的特点是因为java使用数组代替了c++的指针:c++最令人头痛的问题就是内存问题,java的健壮性使编程人员不用再考虑内存的问题:这种观点 ...

  5. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  6. 【转】Java内存与垃圾回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  7. PHP内存管理 垃圾回收

    来源:http://www.jianshu.com/p/63a381a7f70c 概述 1) 操作系统直接管理着内存,所以操作系统也需要进行内存管理,计算机中通常都有内存管理单元(MMU) 用于处理C ...

  8. 使用Activator.CreateInstance完善简单工厂

    前几天在项目中看到别人的工厂类使用Activator.CreateInstance() 之前用简单工厂都是用switch ...case ,之前没有用过便查了查资料,正是这个方法+ 反射简化了工厂模式 ...

  9. 后端学习 - JVM(上)内存与垃圾回收

    JVM 架构图 文章目录 一 JVM 简介 二 类加载子系统: 1 作用 2 类的三个加载过程 3 类加载器的分类 4 双亲委派机制 5 两个 class 对象为同一个类的必要条件 三 运行时数据区: ...

最新文章

  1. ROS系统 创建工作空间与功能包
  2. Java提高篇——Java中的异常处理
  3. 俞敏洪回应新东方股价跌破1美元
  4. python数据类型-元组(tuple)
  5. 【java学习之路】(java SE篇)001.java初识
  6. 【VRP】基于matlab改进的模拟退火和遗传算法求解车辆路径规划问题【含Matlab源码 343期】
  7. 噪声报警c语言程序,环境噪声监测器(软件部分).doc
  8. 复制PS图层的样式到其它图层
  9. gmoj 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林
  10. java的可执行文件_java生成可执行文件的方法总结
  11. 抗混叠滤波的Matlab解释
  12. MySQL 是什么?
  13. 【短视频SDK】短视频SDK License的策略
  14. AcWing 3725. 卖罐头 有意思的数学推导 思维
  15. 时隔27年,微软IE浏览器正式退出历史舞台,一个时代的结束
  16. 2020 国内公司前端团队都在搞些什么?
  17. 旋转矢量(法向量)转化欧拉角
  18. plotly使用基本介绍
  19. mysql常用增删改脚本 DBA可重复执行.sql文件
  20. 勤劳的人,一步一个脚印,加油

热门文章

  1. srgan要训练多久_SRGAN-超分辨率图像复原
  2. Qt常用数据类型转换
  3. Qt输入输出之QProcess
  4. #pragma预处理指令详解
  5. 光纤传感器实验模块_土工离心机试验专用微型光纤孔隙水压传感器
  6. stream场景用法总结
  7. php7安装redis扩展和memcache扩展
  8. vmware虚拟机i copied it 和 i moved it的区别
  9. 竞价这种方式适合不适合GPU云服务器,怎么买更划算??
  10. 纯前端实现人脸识别-提取-合成