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,一经查实,立即删除!

相关文章

CentOS7桌面版系统使用的一些小技巧

1、 清空~/.kde/ 文件下的文件&#xff0c;登陆后不显示桌面的解决方法 在使用CentOS7 桌面系统时&#xff0c;有时候打开文件会很卡。这时我们需要清空当前用户下的 .kde 文件下的所有文件。 再重新登陆该用户时&#xff0c;会发现桌面上的图标都不显示了。 首先查看一下系统语…

计算机网络流量图阅读与理解,计算机网络流量监控的设计与实现

摘要&#xff1a;网络管理的重要工作是进行实时网络监控,网络监控主要是进行网络流量,状态,行为信息的采集,将采集的信息进行统计和分析,得到网络的流量状态数据,采集的网络流量信息包括了动态信息和静态信息两部分,本文在此基础上,进行了网络流量监控管理系统的研究. 本文首先…

阿里一面经验总结

今天的面试很突然&#xff0c;中午十一点收到电话通知&#xff0c;下午五点面试&#xff0c;之前毫无准备【以后要坚决杜绝这种情况】&#xff0c;一共六个小时&#xff0c;可以说是特别紧张的&#xff0c;从挂断电话就一直坐卧不安&#xff0c;主要还是没复习心里没底&#xf…

html本地访问超时时限,本地主机访问不了nginx 页面,请求超时

SQL Tuning 基础概述04 - Oracle 表的类型及介绍Tables A table describes an entity such as employees. You define a table with a table name, such as ...数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)第一步: 首先创建一个数据库连接池的接口: 数据库连接…

[LintCode笔记了解一下]64.合并排序数组

Given two sorted integer arrays A and B, merge B into A as one sorted array. 思路: 因为A的后面的部分都是空的留出来给我们放元素,所以最好是从后往前塞元素进去 void mergeSortedArray(int A[], int m, int B[], int n) {// write your code hereint i m-1;int j n-1;…

微型计算机常用的worm是,2010江西省计算机等级考试试题 二级C试题考试答题技巧...

1、当前使用的微型计算机&#xff0c;其主要器件是由( B )构成的。A、晶体管 B、大规模、超大规模集成电路C、中、小规模集成电路 D、微处理器集成电路2、下列字符中&#xff0c;ASCII码值最小的是( B )A、a B、A C、x D、Y3、在计算机的应用中&#xff0c;“OA”表示( C)A、管…

关于避免对toString()结果进行解析或基于逻辑的美德

使用Java或我使用过的其他编程语言&#xff0c;我发现有时可以用该语言完成某些事情&#xff0c;但通常不应该这样做。 通常&#xff0c;这些误用语言似乎无害&#xff0c;当开发人员首次使用它们时可能有益&#xff0c;但后来同一位开发人员或另一位开发人员遇到了相关的问题&…

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…

不要讨厌HATEOAS Part Deux:HATEOAS的春天

在我关于HATEOAS的系列文章的最后结论中&#xff0c;我们将深入探讨如何使用Spring-Data-REST和Spring-HATEOAS实现HATEOAS。 HATEOAS的春天到了&#xff01; 我整理了一个有效的项目&#xff0c;该项目将演示下面的代码示例以及其他一些功能。 该项目可以在这里找到&#xff…

linq内联左联

内联&#xff1a;没有into 左联&#xff1a;有into 例子&#xff1a; from GoodsStore in this.GetCurrentDbSession.Tbl_OfficeSupplies_GoodsStoreDLL.LoadEntities(a > (Guid.EmptyGoodsID?true:a.GoodsIDGoodsID)) join goods in GetCurrentDbSession.Tbl_OfficeSuppli…

计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...

试题1、计算机安装、连接、调试试题2、文字录入b)中文基本录入&#xff1a;在十分钟之内录入以下中文内容&#xff0c;错误率不高于千分之三。c)公式录入&#xff1a;在文档的结尾处录入下列公式。d)完成以上操作后&#xff0c;将最终结果以“高级2-1.doc”为文件名&#xff0c…

ls 显示目录下的内容和文件相关属性信息

1.命令功能 ls命令是“list directory contents”&#xff0c;显示当前目录下的内容和文件属性。 2.语法格式 ls [option] file ls 选项 文件名 3.选项说明 参数 参数说明 -a 显示全部文件包括隐藏文件&#xff0c;包括.和.. -A 显示全部文件&#xff0c;但是不包括.和…

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

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

maven jpa_使用Hibernate 4,JPA和Maven的架构创建脚本

maven jpa这种情况很简单–您想要在构建应用程序时生成数据库模式创建脚本&#xff08;然后在目标数据库上执行脚本&#xff09;&#xff0c;这在Hibernate 3中相对容易&#xff0c;因为有 hibernate3-maven-plugin &#xff0c;但是与Hibernate 4不兼容。当然&#xff0c;对于…

读取带空格字符串小结

1 &#xff0c;gets() 可以无限读取&#xff0c;以回车结束读取&#xff0c;C语言中的函数&#xff0c;在C中运行会产生bug。 如&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() { chara[50]; cin>>a; gets(a); cout&l…

计算机x线摄影的发展趋势,计算机X线摄影技术----CR 新进展

结构化存贮荧光体(针状成像板)(Structured Storage Phosphors(Needle ImagePlates))结构化荧光体&#xff0c;也就是各向异性物理结构&#xff0c;已经存在很久&#xff0c;且已得到广泛应用&#xff0c;比如在影像增强管中吸收X线&#xff0c;并将射线激励的可见光导入成像链的…

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

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

使用Java将项目插入DynamoDB表

在上一篇文章中&#xff0c;我们学习了如何使用Java创建DynamoDB表。 下一步是将项目插入到先前创建的DynamoDB表中。 请记住&#xff0c;对于插入操作&#xff0c;最基本的步骤是指定主键。 对于表用户&#xff0c;主键是属性电子邮件。 您可以根据需要添加任意数量的属性&am…

计算机vb操作题评分细则,上机考试的试题及评分标准.doc

上机考试的试题及评分标准上机题总分占40分&#xff0c;其中改错题占14分&#xff0c;编程题占26分。(1)改错题&#xff1a;题目中都是设3个错误点(在历年上机考题中也出现过只有2个错误点的试题)&#xff0c;一般分别是语法错误(如数组的声明、重复定义等略有难度的语法错误)、…