自适应堆大小

一次性咖啡杯 在改进我们的测试平台以改进Plumbr GC问题检测器的同时 ,我最终编写了一个小型测试用例,我认为这对于更广泛的读者来说可能很有趣。 我追求的目标是测试JVM在eden,survivor和Tenured空间之间如何分割堆方面的自适应性。

测试本身正在成批生成对象。 批处理每秒生成一次,每个批处理大小为500KB。 这些对象被引用五秒钟,此后将删除引用,并且该特定批处理中的对象可以进行垃圾收集。

该测试是使用ParallelGC在Mac OS X上的Oracle Hotspot 7 JVM上运行的,具有30MB的可用堆空间。 了解了平台,我们可以预期JVM将使用以下堆配置启动:

  • JVM将以Young中的10MB和Tenured空间中的20MB开头,因为没有显式配置,JVM将使用1:2的比率在Young和Tenured空间之间分配堆。
  • 在我的Mac OS X中,在Eden和两个Survivor空间之间进一步分配了10MB的年轻空间,分别为8MB和2x1MB。 同样,这些是所使用的特定于平台的默认值。

的确,当启动测试并使用jstat在后台进行窥视时,我们将看到以下内容,这证实了我们的餐巾纸估计:

My Precious:gc-pressure me$ jstat -gc 2533 1sS0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
1024.0 1024.0  0.0    0.0    8192.0   5154.4   20480.0      0.0     21504.0 2718.9      0    0.000   0      0.000    0.000
1024.0 1024.0  0.0    0.0    8192.0   5502.1   20480.0      0.0     21504.0 2720.1      0    0.000   0      0.000    0.000
1024.0 1024.0  0.0    0.0    8192.0   6197.5   20480.0      0.0     21504.0 2721.0      0    0.000   0      0.000    0.000
1024.0 1024.0  0.0    0.0    8192.0   6545.2   20480.0      0.0     21504.0 2721.2      0    0.000   0      0.000    0.000
1024.0 1024.0  0.0    0.0    8192.0   7066.8   20480.0      0.0     21504.0 2721.6      0    0.000   0      0.000    0.000
1024.0 1024.0  0.0    0.0    8192.0   7588.3   20480.0      0.0     21504.0 2722.1      0    0.000   0      0.000    0.000

从这里,我们还可以对即将发生的情况给出下一组预测:

  • 伊甸园中的8MB内存将在16秒内填满-请记住,我们每秒生成500KB的对象
  • 在每一刻,我们都有大约2.5MB的活动对象-每秒生成500KB,并将对象的引用保持五秒钟,这大约等于我们的数量
  • 每当Eden满时,次要GC都会触发-这意味着我们应该每16秒左右看到一次次要GC。
  • 在进行次要的GC之后,我们将过早地进行升级– Survivor空间只有1MB大小,而2.5MB的现场设置将无法容纳我们的1MB Survivor空间中的任何一个。 因此,清洁伊甸园的唯一方法是将1.5MB(2.5MB-1MB)的不适合生存者的活动物体传播到终身空间。

查看日志也使我们对这些预测充满信心:

My Precious:gc-pressure me$ jstat -gc -t 2575 1s
Time   S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   6.6 1024.0 1024.0  0.0    0.0    8192.0   4117.9   20480.0      0.0     21504.0 2718.4      0    0.000   0      0.000    0.0007.6 1024.0 1024.0  0.0    0.0    8192.0   4639.4   20480.0      0.0     21504.0 2718.7      0    0.000   0      0.000    0.000... cut for brevity ...14.7 1024.0 1024.0  0.0    0.0    8192.0   8192.0   20480.0      0.0     21504.0 2723.6      0    0.000   0      0.000    0.00015.6 1024.0 1024.0  0.0   1008.0  8192.0   963.4    20480.0     1858.7   21504.0 2726.5      1    0.003   0      0.000    0.00316.7 1024.0 1024.0  0.0   1008.0  8192.0   1475.6   20480.0     1858.7   21504.0 2728.4      1    0.003   0      0.000    0.003... cut for brevity ...29.7 1024.0 1024.0  0.0   1008.0  8192.0   8163.4   20480.0     1858.7   21504.0 2732.3      1    0.003   0      0.000    0.00330.7 1024.0 1024.0 1008.0  0.0    8192.0   343.3    20480.0     3541.3   21504.0 2733.0      2    0.005   0      0.000    0.00531.8 1024.0 1024.0 1008.0  0.0    8192.0   952.1    20480.0     3541.3   21504.0 2733.0      2    0.005   0      0.000    0.005... cut for brevity ...45.8 1024.0 1024.0 1008.0  0.0    8192.0   8013.5   20480.0     3541.3   21504.0 2745.5      2    0.005   0      0.000    0.00546.8 1024.0 1024.0  0.0   1024.0  8192.0   413.4    20480.0     5201.9   21504.0 2745.5      3    0.008   0      0.000    0.00847.8 1024.0 1024.0  0.0   1024.0  8192.0   961.3    20480.0     5201.9   21504.0 2745.5      3    0.008   0      0.000    0.008

不是在16秒内,而是每15秒左右,垃圾收集就会启动,清理Eden,并将约1MB的活动对象传播到其中一个Survivor空间,并将剩余空间溢出到Old space。

到目前为止,一切都很好。 JVM确实表现出我们所期望的方式。 JVM监视了一段时间之后,有趣的部分开始了,并开始了解正在发生的事情。 在我们的测试案例中,这大约在90秒内发生:

My Precious:gc-pressure me$ jstat -gc -t 2575 1s
Time   S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   94.0 1024.0 1024.0  0.0   1024.0  8192.0   8036.8   20480.0     8497.0   21504.0 2748.8      5    0.012   0      0.000    0.01295.0 1024.0 3072.0 1024.0  0.0    4096.0   353.3    20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.01496.0 1024.0 3072.0 1024.0  0.0    4096.0   836.6    20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.01497.0 1024.0 3072.0 1024.0  0.0    4096.0   1350.0   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.01498.0 1024.0 3072.0 1024.0  0.0    4096.0   1883.5   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.01499.0 1024.0 3072.0 1024.0  0.0    4096.0   2366.8   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.014
100.0 1024.0 3072.0 1024.0  0.0    4096.0   2890.2   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.014
101.0 1024.0 3072.0 1024.0  0.0    4096.0   3383.7   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.014
102.0 1024.0 3072.0 1024.0  0.0    4096.0   3909.7   20480.0    10149.6   21504.0 2748.8      6    0.014   0      0.000    0.014
103.0 3072.0 3072.0  0.0   2720.0  4096.0   323.0    20480.0    10269.6   21504.0 2748.9      7    0.016   0      0.000    0.016

我们在这里看到的是JVM的惊人适应性。 在了解了应用程序的行为之后,JVM调整了幸存者空间的大小,使其足以容纳所有活动对象。 现在,Young空间的新配置为:

  • 伊甸园4MB
  • 幸存者空间各3MB

此后,GC频率增加–伊甸园现在减小了50%,而不是大约16秒,它现在大约填充了8秒左右。 但是好处也显而易见,因为幸存者空间现在足够大,可以在任何给定时间容纳活动物。 再加上没有对象的生存时间超过一个较小的GC周期(请记住,在任何给定时间只有2.5MB的生存对象),我们便停止将对象提升到旧空间。

继续监视JVM,我们发现采用后旧空间使用率是恒定的。 没有更多的对象传播到旧的对象,但是由于没有触发任何主要的GC,在适应发生之前设法传播的约10MB垃圾将永远存在于旧的空间中。

如果您确定自己在做什么,还可以选择“惊人的适应性”。 在JVM参数中指定-XX-UseAdaptiveSizingPolicy将指示JVM坚持在启动时给定的参数,而不是试图超越您。 谨慎使用此选项,现代JVM通常非常擅长为您预测合适的配置。

翻译自: https://www.javacodegeeks.com/2014/10/adaptive-heap-sizing.html

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

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

相关文章

错误笔记

1、user_name a and password b时,无法打印到这个节点,原因是 a "yajuan" b 123456时 a 为字符串类型,b为数字类型,类型不同“且”的关系不成立。导致if 节点失败 转载于:https://www.cnblogs.com/wangyajuanjuan…

第一次Java 8体验

像世界其他地方一样,我深深地爱上了Slack。 为什么? 原因很多,但主要的原因是它提供了一种围绕通讯而非工具真正构建SDLC流程的新方法。 您认为这些天哪个更常见,杂乱无章的机智团队在荒野中四处徘徊,尽管他们有出色的…

七个重要习惯——读《高效能人士的七个习惯》整理

个人的成功习惯一:积极主动习惯二:以始为终习惯三:要事第一 公众的成功习惯四:双赢思维习惯五:知彼解己习惯六:综合综效 习惯七:不断更新 附图: 转载于:https://www.cnblogs.com/ziq…

POJ2941 SDUT2371Homogeneous squares

View Code 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 long i,j,n,g,s,t,a[1001],b[1001]; 6 char str[8001];//这里数组开大一点 第一次RT了 数比较大 7 while(scanf("%ld", &n)&&n) 8 { 9 s …

不变性如何提供帮助

在最近的几篇文章中&#xff0c;包括“ Getters / Setters。 邪恶。 期。” &#xff0c; “对象应该是不可变的”和“依赖注入容器是代码污染者” &#xff0c;我普遍将所有可变对象标记为“ setter”&#xff08;以set开头的对象方法&#xff09;。 我的论证主要基于隐喻和抽…

浅谈.Net版(C#)的CMP模式

商城上线快2、3个月了&#xff0c;一直都懒得写点东西&#xff0c;在加上杂七杂八的事情也比较忙&#xff0c;所以都没有把这个系统当时做的整个架构思绪整理清&#xff0c;昨天才从深圳完了两天回来&#xff0c;怎感觉是要做的事来着.刚开始接触CMP模式的时候也是看了它几天,到…

Java Servlet教程– ULTIMATE指南(PDF下载)

Java Servlets是一种基于Java的Web技术。 Java Servlet技术为Web开发人员提供了一种简单&#xff0c;一致的机制&#xff0c;以扩展Web服务器的功能并访问现有的业务系统。 几乎可以将Servlet看作是在服务器端运行的applet&#xff0c;它没有任何表情。 Java servlet使许多Web…

使用WSO2开发

几个月以来&#xff0c;我又开始使用WSO2产品。 在接下来的文章中&#xff0c;我描述了我遇到的一些&#xff08;小&#xff09;问题以及如何解决它们。 设置开发环境时&#xff0c;我要做的第一件事是在Mac上下载Developer Studi o&#xff08;64位版本&#xff09;。 解压缩…

CSS揭秘(二)背景与边框

Chapter2 背景与边框 1. 半透明边框 基础&#xff1a;了解 RGBA & HSLA 颜色&#xff08;色调 0~360、饱和度、亮度 &#xff08;0%黑色~100%白色&#xff09;、透明度&#xff09; 默认情况下&#xff0c;背景在边框的下层&#xff0c;容器的背景从半透明的边框透上来并…

Hibernate 拦截器 Hibernate 监听器

Hibernate拦截器(Interceptor)与事件监听器(Listener) 拦截器&#xff08;Intercept&#xff09;&#xff1a;与Struts2的拦截器机制基本一样&#xff0c;都是一个操作穿过一层层拦截器&#xff0c;每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理。  监听器&am…

深入探讨用位掩码代替分支(3):VC6速度测试

wuhanbingwhdx提到了数据相关也会影响流水线&#xff08;http://blog.csdn.net/zyl910/article/details/1330614&#xff09;。  他的说法是有一定道理的。但是&#xff0c;在很多时候我们并不仅仅处理一个数值。比如将循环展开&#xff0c;在内循环处理2个或更多个的数值。而…

Web安全相关(三):开放重定向(Open Redirection)

简介 那些通过请求&#xff08;如查询字符串和表单数据&#xff09;指定重定向URL的Web程序可能会被篡改&#xff0c;而把用户重定向到外部的恶意URL。这种篡改就被称为开发重定向攻击。 场景分析 假设有一个正规网站http://nerddinner.com/&#xff0c;还有一个恶意网站或钓鱼…

自我修复的JVM

这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案&#xff08;“您尝试过关闭并重新打开它”&#xff09;可能适得其反&#xff0c;弊大于利。 我们没有关闭或重新打开设备的方法&#xff0c;而是拥有一个可以自愈的应用程序&#xff1a;它在…

微信小程序实战–集阅读与电影于一体的小程序项目(八)

31.电影详情页面 movie-template.wxml <view class"movie-container" catchtap"onMovieTap" data-movieId"{{movieId}}"> movie.js onMovieTap:function(event) {var movieId event.currentTarget.dataset.movieid;wx.navigateTo({url…

Resource接口

【转】https://blog.csdn.net/hbtj_1216/article/details/85487787 参考&#xff1a;官方文档 1 简介 Java标准库中的java.net.URL类和标准处理器对于处理低层的资源没有提供很好的功能。例如&#xff0c;并没有提供一个URL的实现能够从classpath或者ServletContext中读取资源等…

JPA实体图

JPA 2.1的最新功能之一是能够使用实体图指定获取计划。 这很有用&#xff0c;因为它允许您自定义使用查询或查找操作检索的数据。 当使用中型到大型应用程序时&#xff0c;通常以不同的方式显示来自同一实体的数据。 在其他情况下&#xff0c;您只想选择最小的信息集即可优化应…

微信小程序实战–集阅读与电影于一体的小程序项目(三)

14.wx.showToast交互反馈 wx.showToast文档 post-detail.js添加个消息提示框 onCollectionTap: function(ev) {var postsCollected wx.getStorageSync(posts_Collected)var postCollected postsCollected[this.data.currentPostId]postCollected !postCollected;postsCol…

Java SE 8新功能介绍:Lambda的遍历,过滤,处理集合和方法增强

在“ Java SE 8新功能导览”系列的这篇文章中&#xff0c;我们将深入解释并探索代码&#xff0c;以了解如何使用lambda表达式和方法引用 遍历集合 &#xff0c;并使用谓词接口过滤它们&#xff0c;实现默认方法在接口中&#xff0c;最后在接口中实现静态方法 。 在上一篇文章“…

C#锐利体验-第八讲 索引器与操作符重载(转)

第八讲 索引器与操作符重载 南京邮电学院 李建忠&#xff08;cornyfield263.net&#xff09; 索引 C#锐利体验 "Hello,World&#xff01;"程序C#语言基础介绍Microsoft.NET平台基础构造类与对象 构造器与析构器方法域与属性索引器与操作符重载 数组与字符串特征与映射…

Java EE 7 / JAX-RS 2.0:具有自定义HTTP标头的简单REST API身份验证和授权

在使用已可用的HTTP协议实施Web服务时&#xff0c;REST带来了很多便利。 通过仅通过指定的URL触发GET&#xff0c;POST和其他HTTP方法&#xff0c;您将确保通过REST服务的响应来完成某些工作。 但是&#xff0c;无论REST给开发人员带来了什么便利&#xff0c;安全性和访问控制的…