64位系统好不好用java_64位系统环境时Java的性能

如果你要买一辆车而且你的首要目标是性能或者更具体的说是原始动力,那么在4缸发动机和8缸发动机之间选择的话,答案很显然,因为越大越好。通常而言,当我们看计算机配置列表或者产品宣传的时候,64位的性能也比32位有优势,同样四核比双核更棒。本文引用地址:http://www.eepw.com.cn/article/201706/348396.htm

然而许多在大同世界里很简单的道理包括越多/大越好,移到计算机领域里就不是那么回事了。当处理多重CPU时,你会觉得那些多核所多出来的处理单元很有用,但如果你的工作仅仅是单线程的,那你要做的却是让其他核一边歇着。

32位与64位的比较则更加细微。x86-64 架构不仅在x86架构的基础上增大了寄存器,而且还增加了寄存器的数量。从基本上说这会带来更好的性能(因为更多的寄存器可以让编译器创建更好的机器代码)。然而很不幸,至今把Java从32位移到64位带来的只是性能的下降。

谈到Java的性能,runtime的两个方面很关键:JIT和GC。JIT的作用使尽可能快地执行代码;GC的作用是(在管理存储的同时)从代码的执行中抽取尽可能少的时间。因而Java的性能是让JIT(在更多存储器的帮助下)产生更多理想代码,并减少GC用以管理存储的时间(指针越大这越困难)。

Java 9最初是设计为32位系统的而且这影响了我们在代码基(code base)做的一些早期决定。早几年前我曾花费不少时间试图在运行64位的PowerPC系统上运行我们的Smalltalk VM,得到的结论是:最直接的解决方式是让所有的数据结构(对象)变得两倍大来处理64位指针。随着Java 9的发展(大约2001),我们拿到手的最早的一个64位系统是一个Dec Alpha,所以我们采用了这种最直接的“变大”解决方法,允许一个通常的代码基既支持32位也支持64位。

64位CPU拥有更宽的数据总线,但是同样是这个64位CPU可以运行32位的代码,而且拥有同样宽的数据总线。回头看看我们64位的解决方案——将数据结构变得两倍大,效果却不如相同硬件上的32位,也就是说64位不及32位。这个问题不是Java 9也不是Java所独有的,因为所有的64位都需要数据扩展。只是说Java语言将这一问题凸显得更加明显,因为Java编程通常与创建、操控对象(也称数据结构)有关。

性能问题的解决方法是聪明地处理数据结构,这也正是我们在Java6 JDK中使用压缩列表特性(compressed references feature)所做的。我们可以玩小聪明而且不会被抓到,因为使用者(Java程序员)并不清楚Java对象更深处的表现。

折中的处理方法是通过在对象内存储更少的信息,限制可以被JVM使用的存储。这是一个相当不错的处理方法,因为计算机存储的规模远不及64位的极限地址范围。我们仅使用32位来存储指针,并充分利用8字节对象对齐(aligned objects)来得到一些空位(指针 3)。因此使用压缩列表(compressed references)——Xcompressedrefs,IBM Java6 JDK可寻址高达32Gb的堆。

并不只我们使用这种技巧,Oracle/BEA有-XXcompressedRefs,Sun有-XX:+UseCompressedOops。当然,不同厂商的方法在限制和支持等级上略有不同。也许你会有异议,但当用户运行到32位操作系统的堆栈极限时,他们就想要64位系统(同时还要不损失性能)。

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

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

相关文章

删除重复的数据

delete sfz where sf_id not in( select min(sf_id) as autoID from sfz group by 合同编号,姓名 )转载于:https://www.cnblogs.com/MyBeN/archive/2012/09/27/2705709.html

对lIKE语句的优化

在大表中,进行模糊查询,一般情况下是用LIKE%%,但是这个东西走的是全表扫描,如果在数据量非常大的情况下,效率特别慢,因此,尝试用ORACLE函数INSTR()来解决。 实验步骤如下&#xff1a…

java 计算 时间差_Java8 时间差计算

方式一:/*** DateTimeFormatter java 8 线程安全* throws Exception*/Testpublic void testTimeDiff() throws Exception {// DateTimeFormatter formatter DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Shanghai…

java spring druid_Spring配置Druid连接池

最近项目用c3p0数据连接池有问题,因此换成了druid连接池,它的优点是可以很好的监控DB池连接和SQL的执行情况。在此做个记录便于下次使用。1、首先导入Spring(网上很多这里我就不列举了)和Druid(druid-1.0.9.jar)的相关jar包2、在web.xml中搭建Spring和Dr…

Ubuntu11.04 3945ABG无线网卡驱动安装

由于对无线上网的需求,特对Ubuntu11.04的无线驱动进行安装,一波三折。 首先是"系统设置"-->"硬件"-->"附加驱动",显示“这个系统上没有使用专有驱动”,也就是找不到3945ABG无线网卡的驱动。 …

Java获取本地ip方法_Java获取本地IP方法详解

获取本地服务器IP经常会出现127.0.0.1,0:0:0:0:0:0:0:1,fe80:0:0:0:960:74bd:e1a0:e5b9%11 这些情况,以下代码可解决此问题public static void main(String[] args) {try {Enumeration enumeration NetworkInterface.getNetworkInterfaces()…

记录android点滴(一)--通过build.prop实现产品定制的方法

1、通过build.prop实现产品定制的方法: 1)以编译模拟器的Generic版本为例,system.prop文件处 于以下位置(相对于工程根目录): ./build/target/board/generic/system.prop 里面的内容如下: # # s…

Java连接SQL数据库失败的分析思路

简单的说下java连接SQL数据库的步骤: 1. 首先要有一个jtds.jar数据库驱动包。 2. 可先在项目下新建一个Folder,取名为lib,把jtds驱动包放到lib文件夹下。 3. 在项目上右键 build path → add External Archive 找到自己项目下刚才新建的lib文件夹&…

java 图片上传 预览 demo_图片上传预览

【实例简介】实现图片上传预览,可以增加新的空数组,并上传和替换。还有删除功能;提交的时候,还可以判断是否有空的img【实例截图】【核心代码】613ddc50-96b8-4197-ba2e-1e84f3346fb9└── demo├── assets│ ├── css│ …

ADO连接各种数据库

通过ADO连接各种数据库的字符串集 海南省信息服务中心 温大文 在网络编程过程中,ADO(Activex Data Object)编程往往是不可少的工作,特别是开发电子商务网站。既然讲到ADO数据对象,那么就顺便简单地介绍一下ADO数据对象…

java验证码限流_Java实现系统限流

在微服务系统中,缓存、限流、熔断是保证系统高可用的三板斧,今天我们就来聊聊限流。限流是保障系统高可用的方式之一,当然啦也是大厂高频面试题,如果阿里的面试官问一句:“如何实现每秒钟1K个请求的限流?”…

(转)三层相关案例(及常见的错误)

原文地址:http://www.cnblogs.com/zysbk/archive/2012/10/16/2726895.html三层相关案例(及常见的错误) 今天我们再次带领大家学习三层的知识,由于三层这块的内容在工作中用的比较的多.所以,我再把登录验证密码的题目做一遍.题目中没有了验证用…

数据库的几个概念:主键,外键,索引,唯一索引

主键:主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,…