CompressedOops:Java压缩参考简介

在本文中,我们将向您介绍一种称为Compressed oops的JVM优化。 压缩oop的概念是由32位和64位体系结构之间的差异引起的。 因此,我们将对64位体系结构进行简短的回顾,然后再深入探讨压缩oop的主题。 最后,我们将通过一个简单的示例看到所有这些。

本文的示例代码非常简单,因此我们将不使用任何IDE。 在32位计算机上,压缩oop没有任何意义。 同样,在6u23之前的JDK中,默认情况下未激活它。 因此,我们假设您使用的是比6u23更新的64位JDK。 我们需要的最后一个工具是内存分析器工具。 在此示例中,我们使用了行业标准的Eclipse Memory Analyzer Tool版本1.5。

1. 32位和64位

32位与64位在2000年代初风靡一时。 尽管64位CPU在超级计算机领域并不是什么新鲜事物,但直到最近,个人计算机才将其推向主流。 从32位架构过渡到64位绝非易事,从硬件到操作系统的所有事物都必须改变。 Java通过引入64位虚拟机来拥抱这种转变。

这种过渡的主要优势是存储容量。 在32位系统中,您的内存地址宽度为32位(因此称为名称),这意味着可寻址内存的总量为2 ^ 32或4 GB RAM。 过去,这可能是一台个人计算机的无限内存(毕竟,那些需要超过640kB RAM的内存!),但在拥有1 GB内存的智能手机被认为是低端产品的时候,却不是。 64位体系结构解决了此限制。 在这样的机器中,可寻址内存的理论数量为2 ^ 64,这是一个非常大的数字。 不幸的是,这只是一个理论上的上限,在现实世界中,有很多硬件和软件因素将我们限制在较小的内存上。 例如,Windows 7 Ultimate仅支持最大192GB。 仅将单词用于192 GB似乎有些苛刻,但与2 ^ 64相比,它显得苍白。 现在您已经了解了为什么64位很重要,让我们继续进行下一部分,并了解压缩oop将如何为我们提供帮助。

2.理论上的压缩

“没有免费的午餐之类的东西”。 64位计算机中过多的内存需要付出一定的代价。 通常,一个应用程序在64位系统上会消耗更多的内存,而在非平凡的应用程序中,这个数量是不可忽略的。 压缩的oop通过在64位环境中使用32位类指针来帮助您保留一些内存,前提是您的堆大小不会大于32 GB。 为了更详细地了解这一点,让我们看看如何用Java表示对象。

Java中的对象表示

为了查看Java中对象的表示方式,我们使用一个非常简单的示例,一个持有原始int的Integer对象。 当您编写如下简单的代码行时:

Integer i = new Integer(23);

编译器为此对象分配了超过32位的堆。 在Java中,int的长度为32位,但是每个对象都有标头。 这些标头的大小在32位和64位以及不同的VM中有所不同。 在32位虚拟机中,每个标头字段均为一个字或4个字节。 在64位虚拟机中,保存int的字段保留为32位,但其他字段的大小加倍为8个字节(在64bit环境中为一个字)。 实际上,故事还没有结束。 对象是按字对齐的,这意味着在64位计算机中,它们占用的内存量必须能被64整除。对我们而言,主要关注点是类指针的大小,在Hotspot VM术语中称为Klass。 正如您在下图中所看到的,在64位虚拟机上,klass大小为8个字节,但是启用了压缩oops后,大小变为4个字节。

不同VM中Integer对象的表示形式

不同VM中Integer对象的表示形式

压缩的oop如何实现

压缩后的oop中的oop表示普通对象指针。 这些对象指针(如上一节所述)与计算机的本机指针大小相同。 因此,在32位和64位计算机上,oops大小分别为32位或64位。 使用压缩的oop,我们在64位计算机上具有32位指针。

压缩的oop背后的技巧是内存的字节寻址和字寻址之间的区别。 使用字节寻址,您可以访问内存中的每个字节,但每个字节也需要一个唯一的地址。 在32位环境中,这会将您限制为2 ^ 32字节的内存。 在字寻址中,您仍然具有相同数量的可寻址存储块,但是此存储块是一个字而不是一个字节。 在64位计算机中,一个字为8个字节。 这为JVM提供了三个零位。 Java通过转移这些位来利用它们,以扩展可寻址内存并实现压缩的oop。

3.压缩的行动

要查看压缩的操作的效果,我们使用一个简单的应用程序。 这是一个小的Java对象,它制作了200万个整数的链表。

为了能够查看堆条件,我们使用Eclipse Memory Analyzer Tool。 由于我们没有使用Eclipse IDE,因此我们使用独立的应用程序。 您可以从这里下载。

由于此示例仅使用一个类,因此我们不使用Eclipse或任何其他IDE。 使用文本编辑器并创建一个名为IntegerApplication.java的文件。 在文件中键入以下代码。 请记住,文件名应与java类的名称匹配。 您可以从本文的下载部分下载类文件,而无需手动输入。

IntegerApplication.java

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;public class IntegerApplication {public static void main(String[] args) {List<Integer> intList = new LinkedList<>();for(int i=0;i<2000000;i++){Integer number = new Integer(1);intList.add(number);}Scanner scanner = new Scanner(System.in);System.out.println("application is running...");String tmp = scanner.nextLine();System.exit(0);}
}

打开命令提示符窗口,然后导航到该文件的目录。 使用以下命令进行编译。

javac IntegerApplication.java

现在,您应该有一个IntegerApplication.class文件。 我们运行此文件两次,一次启用压缩oop,第二次不使用压缩oop。 在高于6u23的JVM中,默认情况下启用压缩操作,因此您只需要通过在命令提示符下键入以下命令来运行应用程序:

java IntegerApplication

您可能已经注意到源代码中的Scanner对象。 它用于使应用程序保持活动状态,直到您键入某些内容并终止它为止。 如果在命令提示符下看到“应用程序正在运行...”一词,则该启动内存分析器了。 根据您的计算机,它可能需要一段时间才能完成初始化过程。

从文件菜单中选择获取堆转储...

Craft.io选择窗口

Craft.io选择窗口

您将看到过程选择窗口。 选择名为IntegerApplication的进程,然后单击“完成”。

一段时间后,您将进入MAT的主屏幕。 从工具栏中选择直方图按钮,如图所示:

从工具栏中选择直方图

从工具栏中选择直方图

现在,您可以看到应用程序中所有对象的详细概述。 这是在启用压缩oop的情况下运行的简单应用程序的直方图。

启用压缩oop的应用程序直方图。

启用压缩oop的应用程序的堆转储。

这次,我们在没有压缩的情况下运行应用程序。 为了禁用压缩的oop,我们使用-XX:-UseCompressedOops标志。 您无需再次重新编译类,只需在命令提示符下键入以下命令:

java -XX:-UseCompressedOops IntegerApplication

同样,当您看到“应用程序正在运行...”文本时,将获得与以前相同的堆转储。 这是应用程序在没有压缩的情况下运行时堆转储的直方图。

禁用压缩oop的应用程序堆转储

禁用压缩oop的应用程序堆转储

正如我们预期的那样,堆大小增加了。 堆的大部分被两种类型的对象占据,即链表节点和整数。 在压缩oop版本中,有超过200万个整数需要3200万个字节,而在非压缩oop版本中则需要4800万个字节。 通过简单的数学运算,我们可以看到这完全符合我们的预测。

2000000 *(128/8)= 32000000或32兆字节

2000000 *(192/8)= 48000000或48兆字节

如果您在第二个方程式中注意到我们使用了192,而在上一节中,对象大小被称为160位。 原因是Java是按字节寻址的,因此地址与最接近的8个字节对齐(在这种情况下为192位)。

4。结论

这里提供的示例是人为设计的,但这并不意味着它在现实世界的应用程序中不成立。 与H2数据库应用程序一起测试时,压缩的oop将堆大小从3.6兆字节减少到了3.1兆字节。 这将宝贵堆空间的使用效率提高了近14%。 如我们所见,使用压缩的oop并没有什么危害,实际上,大多数情况下,您不会禁用此功能。 但是,了解编译器技巧的细节可以帮助编写考虑性能的代码。

下载源代码

这是看到压缩的oops效果起作用的示例。

下载
您可以在此处下载此示例中使用的IntegerApplication类的完整代码: IntegerApplication

翻译自: https://www.javacodegeeks.com/2016/05/compressedoops-introduction-compressed-references-java.html

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

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

相关文章

NYOJ90 整数划分(经典递归和dp)

整数划分 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c; 其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。…

昆士兰科技大学计算机专业,昆士兰科技大学QUT计算机科学Computer Science专业排名第101-125位(2021年THE世界大学商科排名)...

2021年THE泰晤士高等教育计算机科学Computer Science专业世界大学排名公布&#xff0c;昆士兰科技大学QUT计算机科学世界排名第101-125位&#xff0c;昆士兰科技大学QUT计算机科学专业实力怎么样呢&#xff1f;下面美英港新留学介绍昆士兰科技大学QUT计算机科学专业培养计划&am…

计算机休眠下睡眠的不同点是什么,电脑的关机选项里,休眠和睡眠有什么具体的区别呢?...

电脑的关机选项里&#xff0c;休眠和睡眠有什么具体的区别呢&#xff1f;以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;电脑的关机选项里&#xff0c;休眠和睡眠有什么具体的区别呢&#x…

开发一个智能问答机器人(优化篇)

上一篇介绍了整个问答机器人的技术架构和特定&#xff0c;本篇着重说下 如何让机器人&#xff08;看起来&#xff09;更智能 输入联想 使用jquery.autosuggest.js实现的输入联想&#xff0c;在输入2个字后&#xff0c;在5000个问答中基于全文检索&#xff0c;检索10条记录&…

java中的单例模型

参考网址:http://www.runoob.com/design-pattern/singleton-pattern.html 1.目的:保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。(比如世界只有一个月亮,党只有一个主席) 2. 优点&#xff1a; 1、在内存里只有一个实例&#xff0c;减少了内存的开销&#x…

跨站点脚本(xss)_跨站点脚本(XSS)和预防

跨站点脚本(xss)如OWASP网站&#xff08;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS&#xff09;&#xff09;所述&#xff0c;跨站点脚本&#xff08;XSS&#xff09;攻击的变种几乎是无限的。 在这里&#xff0c;我建议使用基于Servlet筛选器的解决方案来清…

countdown软件测试死亡时间真假,countdown

countdown死亡倒计时真的假的?countdown这款软件是一款有电影衍生出来的产品&#xff0c;很多朋友都很好奇这个countdownapp测试死亡时间准不准&#xff0c;那么今天小编就为大家带来详细的介绍&#xff0c;感兴趣的朋友们一起来看看吧!这是一款在电影倒忌时中出现的时钟软件&…

在计算机中描述景物结构形状与外貌,在计算机中通过描述景物的结构、形状与外貌,然后将它绘制成图在屏幕上显示出来,此类图像称为_____。...

并实打印现共享文件和机等共享功能&#xff0c;计中通屏完全地相信平等互通&#xff0c;网工需的则所作模局域式是&#xff0c;网络的各没有台计一个内部主次之分若要算机。算机述景包括条件主要区域规划发展。过描的咨项目询包括(准备建设阶段。结构包括咨询主要工程任务师的。…

background-size属性100% cover contain

backgroun-size: 数字&#xff1a;100px 80px 百分比&#xff1a;100% 100% 相对于父元素的&#xff0c;能占满全屏&#xff0c;但是比例可能会失真 cover&#xff1a;占满全屏&#xff0c;可能一部分显示不出来 contain&#xff1a;有一个占满方向占满&#xff0c;背景图不失真…

展示Java开发人员课程包

60个小时以上的课程&#xff0c;5门所有级别的课程&#xff1a;成为Java编程专家 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的Java Developer Course Bundle 仅售39美元&#xff0c;而不是…

吃鸡服务器不接受响应,绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!...

原标题&#xff1a;绝地求生:蓝洞优化服务器性能&#xff0c;从此告别掉帧延迟&#xff01;很多玩家们都非常了解服务器的重要性&#xff0c;服务器响应时间也可以描述为‘网络延迟’。如果服务器的响应时间减少(或者网络延迟减少) 的话&#xff0c;玩家们可以体验到更加顺畅的…

fifa15服务器位置,《FIFA 15》全系统教程图文攻略

《FIFA 15》全系统教程图文攻略2014-09-23 11:04:14来源&#xff1a;3DM论坛编辑&#xff1a;评论(0)《FIFA 15》为EA旗下足球模拟游戏&#xff0c;游戏使用了《UFC》所使用的EA的Ignite引擎&#xff0c;球员的全身细节、动作以及物理破坏效果都相当到位&#xff0c;将给带给玩…

主机做服务器共享文件,主机做文件共享服务器

主机做文件共享服务器 内容精选换一换用户要使用CSG&#xff0c;首先要注册一个华为云帐号&#xff0c;才有访问华为云资源的权限。目前CSG服务处于公测阶段&#xff0c;需要申请公测并通过审核才能使用&#xff0c;商用后自动开通。此外为确保用户能正确快速使用CSG服务&#…

i7怎么老是显示无服务器,i7处理器真有这么差?网友:懂电脑的人都不买!

大家都知道i7处理器的性能非常强劲&#xff0c;但是很多人买电脑时却选择i5或者AMD的&#xff0c;这是为什么&#xff1f;仅仅是价格原因么&#xff1f;可是为什么即使是预算足够&#xff0c;那些懂电脑的人也不会去选择I7处理器&#xff0c;难道名声在外的i7处理器真有这么差&…

JQuery入门

jQuery基础语法 $(selector).action() 查找标签 选择器 id选择器&#xff1a; $("#id") 标签选择器&#xff1a; $("tagName") class选择器&#xff1a; $(".className") 配合使用&#xff1a; $("div.c1") // 找到有c1 class类的div…

Java应用程序的令牌认证

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 2016年5月12日更新&#xff1a;构建…

mac 远程ftp服务器文件共享,mac 远程ftp服务器文件

mac 远程ftp服务器文件 内容精选换一换云堡垒机配置了FTP/SFTP远程备份&#xff0c;报请检查服务器密码或网络连接情况错误&#xff0c;不能启动远程备份。选择备份具体某一天日志&#xff0c;提示备份正在执行&#xff0c;但远程服务器未接收到该备份文件。原因一&#xff1a;…

将Java EE Monolith雕刻成微服务

在介绍了为什么微服务应该由事件驱动的简介博客之后&#xff0c;我想采取一些其他步骤&#xff0c;并在有关博客的同时准备我即将进行的一系列演讲&#xff08;请参阅jBCNconf和Red Hat Summit&#xff0c;旧金山 &#xff09;。 在Twitter christianposta上关注我&#xff0c;…

【终结版】C#常用函数和方法集汇总

C#里面的常用的函数和方法非常重要&#xff0c;然而做题的时候会经常忘记这些封装好的方法&#xff0c;所以我总结一下 C#常用函数和方法集。 【1】C#操作字符串的常用使用方法 在 C# 中&#xff0c;您可以使用字符数组来表示字符串&#xff0c;但是&#xff0c;更常见的做法是…

glassfish_重写到边缘–充分利用它! 在GlassFish上!

glassfish现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces已有一段时间了&#xff0c;即使我可以说服它在3.3.3版本中被称…