没有垃圾回收的JVM
JVM社区不断增加新的GC,最近又添加了一个新的GC,它称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。
看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途,我们将对其进行研究。
可以在哪里使用此灵巧的GC?
性能测试
如果您正在开发对延迟要求严格且内存预算有限的解决方案,那么此GC可用于测试程序限制。
内存压力测试
想知道您的应用程序提取瞬态内存需求。 如果您要构建一些纯粹的内存中解决方案,我会发现这很有用。
基准标记算法。
很多时候,我们希望基于对BIG(O)概念的理解来测试新的酷算法的真实性能,但是垃圾收集器会在测试过程中增加噪音。
低垃圾
很多时候,我们在算法上进行了一些优化以减少产生的垃圾,而像epsilon这样的GC则有助于科学验证优化。
如何启用epsilon GC
JVM工程师特别注意不要在生产中默认启用此GC,因此要使用此GC,我们必须使用以下JVM选项
-XX:+ UnlockExperimentalVMOptions -XX:+ UseEpsilonGC -Xlog:gc
您可能会想到的一个问题是,内存耗尽时会发生什么? 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 -Xlog:gc -Dmb = 5024 MemoryAllocator ),并且它会产生以下输出
[0.016s] [info] [gc]使用G1
[0.041s] [info] [gc]定期GC已禁用
开始分配5024 MB [0.197s] [info] [gc] GC(0)暂停年轻(并发启动)(G1大量分配)116M-> 0M(254M)3.286ms [0.197s] [info] [gc] GC(1)并发周期 [0.203s] [info] [gc] GC(1)暂停备注20M-> 20M(70M)4.387ms [0.203s] [info] [gc] GC(1)暂停清理22M-> 22M(70M)0.043ms [1.600s] [info] [gc] GC(397)并发周期6.612ms [1.601s] [info] [gc] GC(398)暂停年轻(并发启动)(G1混合分配)52M-> 0M(117M)1.073ms [1.601s] [info] [gc] GC(399)并发周期 分配后我还活着 [1.606s] [info] [gc] GC(399)暂停备注35M-> 35M(117M)0.382ms [1.607s] [info] [gc] GC(399)暂停清理35M-> 35M(117M)0.093ms [1.607s] [info] [gc] GC(399)并发周期6.062ms
让我们添加一些内存限制( java -XX:+ UnlockExperimentalVMOptions -XX:+ UseEpsilonGC -Xlog:gc -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,已提交253M(24.77%),已使用52640K(5.02%) [0.171s] [info] [gc]堆:已保留1024M,已承诺253M(24.77%),已使用103M(10.10%) [0.579s] [info] [gc]堆:已保留1024M,已落实1021M(99.77%),已使用935M(91.35%) [0.605s] [info] [gc]堆:已使用1024M,已承诺1021M(99.77%),已使用987M(96.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
没有垃圾回收的JVM相关推荐
- JVM内存与垃圾回收篇——JVM与Java体系结构
前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设 ...
- java stw_快速理解Java垃圾回收和jvm中的stw
Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外).Java中一种全局暂停现象,全局停顿,所有Java代码停 ...
- java加快内存回收_java内存管理之垃圾回收及JVM调优
GC(garbage Collector 垃圾收集器) 作用:a.内存的动态分配:b.垃圾回收 注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.J ...
- jvm回收垃圾_没有垃圾回收的JVM
jvm回收垃圾 JVM社区不断增加新的GC,最近又添加了一个新的GC,它被称为Epsilon ,是非常特殊的一个. Epsilon仅分配内存,但不会回收任何内存. 看起来好像不执行任何垃圾回收的GC用 ...
- Java对象垃圾回收调用,JVM垃圾回收之哪些对象可以被回收
1.背景 Java语言相比于C和C++,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由JVM来完成.在Java中,运行时的数据区域分为程序计数器.Java虚拟机栈.本地方法栈.方法 ...
- 【JVM】JVM基础知识:垃圾回收、JVM调优
垃圾回收 对象被创建之后就可以使用了,当对象被使用完了.没有作用了之后 JVM 就把它当作垃圾给清除掉了. 所以怎么判断一个对象没有作用了就是垃圾回收的第一步----判断对象是否是垃圾. 怎么判断一个 ...
- jvm垃圾回收之JVM GC算法
标记-清除: 标记-压缩 复制算法: Hotspot分代复制算法 bump-the-pointer和TLABs: bump-the-pointer:指针碰撞机制会跟踪在eden区创建的最后一个对象,并 ...
- 一文详解,jvm内存分代与垃圾回收原理
jvm运行时数据区 Java程序启动后,本质上就是启动一个jvm进程,jvm会将自己管理的内存划分为几个区域,每个区域都有自己的用途.在程序运行时的内存区域主要可以划分为五个,分别是:方法区.堆.虚拟 ...
- jvm性能调优 - 03垃圾回收机制
文章目录 Pre 对象的分配与引用 一个方法执行完毕之后会怎么样? 不再需要的那些对象应该怎么处理?--GC 思考题 Pre 上一篇文章给大家分析了JVM中的几块内存区域分别都是干什么的,今天的文章就 ...
最新文章
- Python学习day13-函数进阶(1)
- Abaqus中施加移动车辆荷载(待整理)
- Unity3d 协程、调用函数、委托
- 【机器学习PAI实践十二】机器学习算法基于信用卡消费记录做信用评分
- mysql 终止 存储过程
- 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
- 三维触控测试软件,10 条小技巧,告诉你 iPhone XS Max 的三维触控功能怎么用
- try-catch-finally的执行顺序
- Milking Grid poj2185
- libuv udp server和client
- [POJ 1273]Drainage Ditches
- 王振质问于谦,死得越多说明越伟大?
- vac虚拟声卡我linux,虚拟声卡驱动应用及其原理简要说明
- python 进制转换
- 会议室管理系统源码分享-Spring mvc+mybatis+jpa+mysql+bootstrap
- 计算机双机对连局域网,图解双机/多机无线互联技巧_局域网教程
- 曾国藩【挺经】全文 不错的文章,值得学习!
- PXI标准– PXI规范更新总结
- Node.JS的魔力与神话
- 蚂蚁金服 g6 用法