jvm回收垃圾_没有垃圾回收的JVM

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回收垃圾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C打印函数printf的一种实现原理简要分析

【0】README 0.1&#xff09;本文旨在对 printf 的 某一种 实现 原理进行分析&#xff0c;做了解之用&#xff1b;0.2&#xff09; vsprintf 和 printf.c 的源码&#xff0c;参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统&#xff1a;Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具&#xff0c;需要自己安装安装命令&#xff1a;sudo apt install tcpxtract使用方法…

java设计模式适配器模式_Java中的适配器设计模式

java设计模式适配器模式适配器设计模式是一种结构设计模式 &#xff0c;可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。 在设计一个面向对象的应用程序时&#xff0c;当我们的客户期望一个特…

技术路线的选择重要但不具有决定性

微软在技术上连续大动作&#xff0c;如果放在几年前&#xff0c;我相信微软粉丝们一定是欢声雷动&#xff0c;不过这次情况有点不太一样&#xff0c;在网上看到有人在抱怨微软技术更新速度太快而且四面出击&#xff0c;还有人扬言要改弦更张&#xff0c;投奔Linux或者Java阵营。…

nproc是什么意思_top/htop内容的含义

uptimeuptime命令显示了load avg&#xff0c;它其实是读取的/proc/uptime文件&#xff1a;/proc/uptime 文件cat /proc/uptime9592411.58 9566042.33第一个是系统启动了多久(单位s)&#xff0c;第二个意思是系统启动以来&#xff0c;cpu idle花费的时间(单位s)。多核机器上&…

进程间通信(IPC)+进程加锁解锁

【0】README 0.1&#xff09; source code and text description are from orange’s implemention of a os&#xff1b;0.2&#xff09; for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/ipc_8 【1】看看&#xff0c;我们的进程代…

QA与测试到底有什么区别?

文章目录引言QA与测试的区别&#xff1f;QA、QC、QM的关系与区别&#xff1f;QA工作内容与职责引言 近期微信公众号后台有同学留言问&#xff1a; QA与测试的区别&#xff1f; QA、QC、QM的区别&#xff1f;以及QA的工作内容与职责。 针对这些问题我查阅了一些资料然后结合自…

java 进程运行时间_将Java类作为子进程运行

java 进程运行时间我本周需要将Java类&#xff08;而不是jar&#xff09;作为子进程运行。 更确切地说&#xff0c;我想从测试内部产生一个新进程&#xff0c;而不是直接在测试内部&#xff08;进程内&#xff09;运行它。 我不认为这是幻想或复杂的事情。 但是&#xff0c;这不…

划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信

实验拓扑如下&#xff1a;VPC 26 IP 23.1.1.3 24 VLAN20VPC 25 IP 12.1.1.2 24 VLAN10VPC1 IP 12.1.1.1 24 VLAN10VPC2 IP 23.1.1.2 24 VLAN20IOL交换机命名为SW1 先配置SW1的vlan10 和20检查SW1的vlan信息配置SW1的vlan10 和20检查SW2的vlan信息下一步将SW1和SW2连接的接口改为…

如何通过W3school学习JS/如何使用W3school的JS参考手册

文章目录学习JS对象DOM 对象HTML 对象JS 的常规类型教程学习 jQuery学习平台&#xff1a; W3school类似的学习平台&#xff1a; 菜鸟教程学习JS对象 DOM 对象 HTML 对象 JS 的常规类型 教程 学习 jQuery

快速选择

【0】README 0.1&#xff09;设有一组N 个数而要确定其中第k 个最小&#xff08;大&#xff09;者&#xff0c;我们称之为选择问题&#xff1b; 选择问题的解法&#xff1f;” 解法即为 快速选择算法&#xff1b; 0.2&#xff09; 快速选择是对 快速排序 改造而来&#xff0…

java模板方法模式_Java中的模板方法模式

java模板方法模式模板方法模式是一种行为模式&#xff0c;建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是&#xff0c;算法后面的任何更改只会影响超类中的代码。 此外&#xff0c;它还…

hive 索爱_达内大数据云计算

第一阶段(Java基础)Java语言的高级特性静态导入、自动封箱拆箱、可变参数、增强for、枚举、类加载器、反射、内省、泛型、注解、动态代理回掌握Java语言的高级特性Java多线程多线程加强、线程池、Thread Local掌握Java线程池技术&#xff0c;掌握线程的Join、notify、notifyAll…

建立文件系统

【0】README 0.1&#xff09; source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar&#xff1b; 0.2&#xff09; 此文件系统涉及到的…

判断字符串是否为空

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>检查指定的值是不是空字符串</title><script>function test_1() {// var name document.getElementById("name").value;// ale…

java策略设计模式_Java中的策略设计模式

java策略设计模式策略设计模式是一种行为模式&#xff0c;其中我们有多种算法/策略来完成一项任务&#xff0c;所使用的算法/策略留给客户选择。 各种算法选项封装在单独的类中。 在本教程中&#xff0c;我们将学习在Java中实现策略设计模式。 UML表示形式&#xff1a; 首先&…

随机森林算法 python_Python实现的随机森林算法与简单总结

本文实例讲述了Python实现的随机森林算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;随机森林是数据挖掘中非常常用的分类预测算法&#xff0c;以分类或回归的决策树为基分类器。算法的一些基本要点&#xff1a;*对大小为m的数据集进行样本量同样为m的有放回抽样&…

Hibernate的学习笔记

文章目录简介配置文件hibernate.cfg.xml映射配置文件主键生成方式主键生成方式的配置identitysequencenativeincrementassigned映射类型使用 Hibernate 实现 CRUD简介 Hibernate是对象关系映射&#xff08;ORM&#xff0c;Object RelationShip Mapping&#xff09;框架&#x…

在diy的文件系统上创建文件的流程

【0】README 0.1&#xff09; source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 &#xff1b; 0.2&#xff09;本文总结的内容是干货&#xff0c;…

java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式立面是指建筑物的外观。 当穿过街道时&#xff0c;我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。 同样&#xff0c; 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 …