我们真的仍然需要32位JVM吗?

即使到了今天(2015年),我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM? 我们应该有很受欢迎的意见! 如果只需要较小的堆,则使用32位–它具有较小的内存占用空间,因此您的应用程序将使用较少的内存并触发较短的GC暂停。 但这是真的吗? 我将探索三个不同的领域:

  1. 内存占用
  2. GC性能
  3. 整体表现

让我们从内存消耗开始。

内存占用

众所周知,32位和64位JVM之间的主要区别与内存寻址有关。 这意味着所有在64位版本上的引用都占用8个字节而不是4个字节。幸运的是,JVM附带了压缩对象指针 ,默认情况下,所有小于26GB的堆都启用该对象指针 。 只要32位JVM可以寻址大约2GB(取决于目标操作系统,它仍然要少13倍),那么这个限制对我们来说是可以接受的。 因此,不必担心对象引用。 唯一不同的对象布局是标记标头,它在64位上大4个字节。 我们还知道Java中的所有对象都是8字节对齐的,因此有两种可能的情况:

  • 最糟糕的是– 64位对象比32位对象大8个字节。 这是因为在标头中添加4个字节会导致对象被丢弃到另一个内存插槽中,因此我们必须再添加4个字节来填充对齐间隙。
  • 最佳–两种体系结构上的对象具有相同的大小。 当在32位上有4个字节的对齐间隙时,就会发生这种情况,可以通过其他标记头字节简单地填充该间隙。

现在假设两种不同的应用程序大小来计算这两种情况。 加载了相当大项目的IntelliJ IDEA包含大约700万个对象,这将是我们的较小项目。 对于第二个选项,假设我们有一个大型项目(我称其为“巨大”),其中包含5000万个对象。 现在让我们计算最坏的情况:

  • IDEA -> 7 millions * 8 bytes = 53 MB
  • Huge -> 50 millions * 8 bytes = 381 MB

上面的计算向我们显示,在最坏的情况下,IntelliJ会增加大约50MB的堆,而对于某些带有很小对象的高度粒度化的大型项目,实际的应用程序占地会增加大约400MB。 在第二种情况下,它可能占总堆的25%左右,但是对于绝大多数项目而言,它约为2%,几乎没有。

GC性能

这个想法是使用长键将800万个String对象放入Cache中。 一个测试包含4个调用,这意味着有2400万次放入缓存映射。 我使用并行GC,将总堆大小设置为2GB。 结果令人惊讶,因为整个测试很快就在32位JDK上完成了。 3分40秒,而64位虚拟机为4分30秒。 比较GC日志后,我们可以看到,差异主要来自GC暂停:114秒到157秒。 这意味着实际上32位JVM带来的GC开销要低得多-64位554可以暂停到618。 在下面,您可以查看GC Viewer的屏幕截图(两个轴上的缩放比例均相同)

32位JVM并行GC

32位JVM并行GC

64位JVM并行GC

64位JVM并行GC

我原本希望64位JVM的开销较小,但是基准测试表明,即使总堆使用量在32位上也差不多,我们在Full GC上释放了更多的内存。 年轻一代的停顿时间也相似-两种架构大约为0.55秒。 但是,平均主要停顿在64位上更高,为3.2,而32位上为2.7。 事实证明,小堆的GC性能在32位JDK上要好得多。 问题是您的应用程序对GC的要求是否很高–在测试中,平均吞吐量约为42-48%。

在更多的“企业”场景中进行了第二次测试。 我们正在从数据库加载实体,并在加载的列表上调用size()方法。 对于大约6分钟的总测试时间,对于64位,我们有133.7s的总暂停时间,对于32位,我们有130.0s的总暂停时间。 堆的使用也非常相似– 64位为730MB,32位JVM为688MB。 这向我们显示,对于正常的“企业”用法,在各种JVM架构上的GC性能之间没有太大差异。

从数据库中选择32位JVM并行GC

从数据库中选择32位JVM并行GC

64位JVM并行GC从数据库中选择

64位JVM并行GC从数据库中选择

即使具有类似的GC性能,32位JVM仍可以在20秒前完成工作(大约5%)。

整体表现

当然,要验证适用于所有应用程序的JVM性能几乎是不可能的,但是我将尝试提供一些有意义的结果。 首先,让我们检查时间性能。

Benchmark                    32bits [ns]   64bits [ns]   ratioSystem.currentTimeMillis()       113.662        22.449    5.08
System.nanoTime()                128.986        20.161    6.40findMaxIntegerInArray           2780.503      2790.969    1.00
findMaxLongInArray              8289.475      3227.029    2.57
countSinForArray                4966.194      3465.188    1.43UUID.randomUUID()               3084.681      2867.699    1.08

正如我们所看到的,与长变量相关的所有操作的最大且绝对明显的区别是。 在64位JVM上,这些操作的速度是2.6到6.3倍之间。 使用整数非常相似,生成随机UUID的速度也快7%左右。 值得一提的是,解释代码(-Xint)具有相似的速度-仅64位版本的JIT效率更高。 那么有什么特别的区别吗? 是! 64位体系结构带有JVM使用的其他处理器寄存器。 检查生成的程序集后,看起来性能提升主要来自使用64位寄存器的可能性,这可以简化长时间的操作。 可以在Wiki页面下找到任何其他更改。 如果要在计算机上运行此程序,则可以在我的GitHub上找到所有基准测试– https://github.com/jkubrynski/benchmarks_arch

结论

在整个IT世界中,我们不能简单地回答-“是的,您应该始终使用** bits JVM”。 这在很大程度上取决于您的应用程序特征。 如我们所见,32位和64位体系结构之间存在许多差异。 即使长期相关操作的JIT性能提高了几百个百分点,我们也可以看到,经过测试的批处理进程在32位JVM上更早完成。 结论–没有简单的答案。 您应该始终检查哪种架构更适合您的要求。

非常感谢Wojtek Kudla审阅本文并执行其他测试:)

翻译自: https://www.javacodegeeks.com/2015/05/do-we-really-still-need-a-32-bit-jvm.html

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

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

相关文章

html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法

本文实例讲述了JavaScript实现文字与图片拖拽效果的方法。分享给大家供大家参考。具体实现方法如下:JavaScript实现文字与图片的拖拽效果*{padding:0;margin:0;}.tips{position:absolute;background:#eee;}图片可以拖动脚本之家拖动链接也可以var $idfunction(id){r…

html设置页面的高度和宽度,web显示页面有图像上设置高度和宽度很重要

因此即使浏览器只有HTML,它仍然能够分配适当的空间。所以我们可以修改成以下内容:最近我们发现谷歌浏览器对图片设置有一定的修改,它主要在图像上进行设置width和设置height属性,以防止布局发生变化并改善网站访问者的体验。Web性…

磁盘空间管理工具FolderSizes

现在的硬盘已经到了用TB来计量的级别,但也会感觉在不知不觉间空间竟然不够用了!到底什么东西占用了我们这么多的磁盘空间呢? 这个软件可以帮你快速进行分析。FolderSizes 企业版是一款优秀的磁盘管理工具,它可以有效地帮助我们快速的查看并统…

vscode修改python终端_panda3d是python的一个高级的3D 渲染和游戏开发框架

1 介绍1.1 开发维护者:迪士尼VR工作室和卡耐基梅隆娱乐技术中心。1.2 是一个3D游戏引擎和一个 3D 渲染和游戏开发库。1.3 可以在这个框架下使用 Python 和 C 。1.4 Panda3D 是开源软件, 它的许可证让它可以用于任何用途, 包括商业用途。1.5 是python的三…

HTMl和css项目总结,HTML+CSS项目开发总结

好几天没更新博客了,刚实战完一个HTMLCSS的简单项目。经过几天的摸索,发现收益良多。之前只是单纯得写demo,看知识点,没有亲自实战项目。但实战过后才会了解,如何才能更好地提升自己的技术。针对这次项目开发&#xff…

HDU--4768

题目&#xff1a; Flyer 原题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4768 分析&#xff1a;二分。只需要注意到最多只有一个为奇数&#xff0c;则可以首先求出学生获得的总的传单数&#xff0c;为奇数时&#xff0c;二分找到答案。 1 #include<cstdio&…

js return的值取不到_【JS基础】隐式转换(一)

开篇JS作为一门动态语言十分灵活&#xff0c;但是伴随而来的弱类型隐式转化的问题让我们十分头疼。隐式作为一个大课题&#xff0c;很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理&#xff0c;争取让你每看完一篇都会有加深对于JS隐…

语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...

数据表&#xff08;4张&#xff09;及数据情况&#xff1a;搭建数据表数据参考&#xff1a;空杯希望&#xff1a;转行数据分析师专栏&#xff08;SQL篇&#xff09;-01SQL入门​zhuanlan.zhihu.com一、表的加法1、先新建一个表course1&#xff08;和course表数据结构一致&#…

plsql 设置鼠标行执行_如何制作键盘鼠标产品质量合格证

鼠标前盘属于办公用品套装&#xff0c;一般会一起销售&#xff0c;但是也不排除分开销售&#xff0c;无论是哪种方式键盘鼠标在生产销售时都需要携带对应产品质量合格证&#xff0c;对产品进行简单的说明&#xff0c;更能保障消费者的权益。那么如何制作产品质量合格证呢&#…

第四章例4-2

/* 输入一批学生的成绩&#xff0c;以负数作为结束标志&#xff0c;计算平均成绩&#xff0c;并统计不及格人数 */ #include<stdio.h> int main(void) {int count,num;double grade,total;num0;total0;count0;printf("Enter grades:");scanf_s("%lf"…

html.action 访问分部视图,MVC+EF 随笔小计——分部视图(Partial View)及Html.Partial和Html.Action差异...

Partial View指可以应用于View中以作为其中一部分的View的片段(类似于之前的user control), 可以像类一样&#xff0c;编写一次&#xff0c; 然后在其他View中被反复使用。一般放在"Views/Shared"文件夹中以共享。创建Partial View&#xff1a;一般直接右键"Vie…

svm核函数gamma参数_非线性SVM与核函数

前面几篇我们介绍的都是线性支持向量机&#xff0c;换句话说&#xff0c;我们总可以用一条线或一个超平面将数据进行分割。如下图所示&#xff1a;但在更多情况下&#xff0c;有些数据是无法进行线性分割的。比如下面的例子&#xff1a;也就是说&#xff0c;你永远无法用一条直…

anychart说明文档

今天学习anychart&#xff0c;在慧都控件网上看有关文档&#xff0c;模仿试着做了个demo&#xff0c;发现慧都空间网的“Flash图表AnyChart应用教程六&#xff1a;创建圆形仪表”里的指针“<pointer type"bar" value"35" color"Gray" />”…

h5 神策埋点_咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...

在这个数据爆炸的时代&#xff0c;数据成为各行各业出奇制胜的法宝&#xff0c;运动行业也不例外&#xff0c;那么大数据对运动业有什么价值呢&#xff1f;咕咚作为智能运动的倡导者和先行者&#xff0c;致力于成为全球领先的运动大数据和服务平台&#xff0c;现已为超过 1.5 亿…

JavaFX,Jigsaw项目和JEP 253

因此&#xff0c; Java 9可能会破坏您的代码 …… 如果您的项目使用JavaFX&#xff0c;则这尤其可能&#xff0c;因为许多自定义项和自制控件都需要使用内部API。 借助Project Jigsaw&#xff0c;这些内容将无法在Java 9中访问。幸运的是&#xff0c; Oracle在几天前宣布了 JE…

ios 获取是否静音模式_果粉感动:部分iOS“新功能”早已被安卓玩坏

一年一度的WWDC大会如期举行&#xff0c;今年不仅展示了全新的iOS、iPadOS以及macOS。当然&#xff0c;具体更新了什么相信早已经被各大媒体报道出来&#xff0c;本文并不是重复报道&#xff0c;相反的&#xff0c;iOS经过了13代的发展&#xff0c;有开创性的动作&#xff0c;也…

怎么把桌面计算机隐藏文件,怎么隐藏桌面文件夹名称?隐藏桌面图标下的文字的详细教程...

怎么隐藏桌面文件夹名称&#xff1f;桌面图标一多就会显得很凌乱&#xff0c;特别有的软件名称很长&#xff0c;那么有没有什么方法可以让桌面看起来很清爽呢&#xff1f;当然是有&#xff0c;去掉桌面应用的名称不就简洁清爽了&#xff1f;下面就教大家不利用第三方软件的情况…

window xp系统安装php环境_Windows Server 2003及XP系统如何安装SQL Server 2000数据库?

年头年初节假日就是小编的梗&#xff0c;忙得不可开交&#xff0c;这不越冷越刮风昨天服务器又崩了&#xff0c;折腾了一天安装好Windows Server 2003和IIS(这系统是有点老了&#xff0c;主要是单位机子和各系统也有点年头了&#xff0c;没办法)&#xff0c;做好各项配置后总算…

rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络

每天给小编五分钟&#xff0c;小编用自己的代码&#xff0c;让你轻松学习人工智能。本文将剖析循环神经网络(RNN)的工作原理&#xff0c;精讲循环神经网络的特点和实现方式。野蛮智能&#xff0c;小白也能看懂的人工智能。循环神经网络从何而来&#xff1f;我在我的这篇文章介绍…

摆脱匿名类

我真的很喜欢编写和阅读lambda表达式-它们简洁&#xff0c;富于表现力和时尚&#xff08;来吧&#xff0c;这样就没关系了&#xff01;&#xff09;。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们&#xff01; 在过去的几个月中&#xff0c;这种认识慢慢地实现了&…