32/64位jvm上java原语的大小?
-
int
的大小是32位,long
/double
是64位。 这些尺寸是否保持相同- 32/64位JVM
- 32/64位处理器
- 如果是,那么
long
/double
上的操作是否会在64位处理器/ JVM上成为primefaces?
Oracle Java教程说 :
读取和写入对于引用变量和大多数原始变量(除long和double之外的所有类型)都是primefaces的。
这句话是否与jvm / processor架构有关? 有人可以解释一下。
3.如果我使用64位jvm和处理器,最后我将能够读/写双/长primefaces
是的,32位和64位JVM的大小相同。 对于Java中的long或double,分配不保证是primefaces的。 primefaces分配仍然无法保证来自另一个线程的可见性。 因为允许线程在内存中“遮蔽”变量,所以即使对变量进行primefaces赋值也不一定要写入主内存(但是当主内存更新时,它将以primefaces方式完成)。 如果您希望一个线程始终看到另一个线程的更改,则必须始终使用某种类型的同步障碍从两个或多个线程访问共享状态。
唯一更改大小的数据类型是引用。 这些可以是32位或64位。 一种常见的误解是,所有64位JVM上的引用都是64位,并且会使用更多内存。 在Sun / Oracle Java 6更新23及更高版本上,它成为使用32位引用的默认设置,提供的堆大小小于32 GB。
注意:64位引用是primefaces的,表明这些平台上的long
访问和double
访问也可能是primefaces的。 (虽然不能保证在所有系统上,特别是32位JVM)
根据JLS :
整数类型是byte,short,int和long,其值分别为8位,16位,32位和64位二进制补码整数,以及char,其值为16位无符号整数代表UTF-16代码单元 。
浮动和双倍也一样。
没有提到32位/ 64位处理器/实现jvm,因此在32位或64位上没有任何修改。
int
定义为32位。 它不会因64位与32位VM而改变。 与long
相同 – 它是64位,不会改变。
double
有点棘手。 规格说它是64位宽,所以你至少可以指望它。 有些虚拟机可能会在内部使用更宽的数字来进行实际的数学计算,但是如果你总是将double
strictfp
数视为64位数(或者如果指定strictfp
,那么你应该没问题,这应该确保数字正好是 64位宽,或至少表现得好像)。
至于primefaces性,这在某种程度上取决于平台…但是你会安全地假设对大于int的任何东西的读写都不是primefaces的(除非变量标记为volatile
)。 任何涉及阅读然后编写相同位置的内容对于任何类型都不是primefaces的。 (这意味着++a;
本质上不是primefaces的。)
原始尺寸保持不变。 在64位处理器/ jvm上,堆大小更大,可以使用的线程数增加。