from: http://www.blogjava.net/cangshi004/archive/2012/03/02/371120.html
JAVA之JDK在64位系统默认开启压缩指针分析(请多多指正!)
Sun的HotSpot VM从JDK5开始会根据运行环境来自动设定VM的一些参数(ergonomics)。其中大家最熟悉的可能是它会自动选择client与server模式、堆的初始和最大大小等。事实上ergonomics会设置非常多的内部参数,包括自动选择GC算法、并行GC的线程数、GC的工作区分块大小、对象晋升阈值等等。
Ergonomics相关的逻辑大都在hotspot/src/share/vm/runtime/arguments.cpp中,值得留意的是使用了FLAG_SET_ERGO()的地方。
于是我们可以留意一下几个版本的HotSpot对UseCompressedOops参数的处理的差异:
HotSpot 16:
C++代码
#ifdef _LP64
// Check that UseCompressedOops can be set with
the max heap size allocated
// by ergonomics.
if (MaxHeapSize <= max_heap_for_compressed_oops()) {
if (FLAG_IS_DEFAULT(UseCompressedOops)) {
// Turn off until bug is fixed.
// the following line to return it to default status.
// FLAG_SET_ERGO(bool, UseCompressedOops, true);
}
// ...
}
#endif // _LP64
HotSpot 17:
C++代码
#ifndef ZERO
#ifdef _LP64
// Check that UseCompressedOops can be set with
the max heap size allocated
// by ergonomics.
if (MaxHeapSize <= max_heap_for_compressed_oops()) {
#ifndef COMPILER1
if (FLAG_IS_DEFAULT(UseCompressedOops) && !UseG1GC) {
// Disable Compressed Oops by default. Uncomment
next line to enable it.
// FLAG_SET_ERGO(bool, UseCompressedOops, true);
}
}
#endif
// ...
#endif // _LP64
#endif // !ZERO
HotSpot 19 / HotSpot 20:
C++代码
#ifndef ZERO
#ifdef _LP64
// Check that UseCompressedOops can be set with
the max heap size allocated
// by ergonomics.
if (MaxHeapSize <= max_heap_for_compressed_oops()) {
#ifndef COMPILER1
if (FLAG_IS_DEFAULT(UseCompressedOops) && !UseG1GC) {
FLAG_SET_ERGO(bool, UseCompressedOops, true);
}
#endif
}
// ...
#endif // _LP64
#endif // !ZERO
(注:HotSpot VM的版本号与JDK的版本号之间的关系,请参考另一篇笔记:Sun/Oracle JDK、OpenJDK、HotSpot VM版本之间的对应关系)
可以看到,UseCompressedOops参数从HotSpot 19开始终于开始受ergonomics控制,会在下述条件满足的时候默认开启管道磁力泵:
1、是64位系统(#ifdef _LP64)并且不是client VM(#ifndef COMPILER1);
2、Java堆的最大大小不大于一个阈值(MaxHeapSize <= max_heap_for_compressed_oops());
3、没有通过。hotspotrc或命令行参数手动设定过UseCompressedOops参数的值;
4、没有使用Garbage-First (G1) GC.
第1、3、4点都很直观,于是第2点就是个关键点了:阈值是多大?
还是看回代码,HotSpot 20:
C++代码
void set_object_alignment() {
// Object alignment.
assert(is_power_of_2(ObjectAlignmentInBytes), "ObjectAlignmentInBytes must be power of 2");
MinObjAlignmentInBytes = ObjectAlignmentInBytes;
assert(MinObjAlignmentInBytes >= HeapWordsPerLong * HeapWordSize,
"ObjectAlignmentInBytes value is too small");
MinObjAlignment = MinObjAlignmentInBytes / HeapWordSize;
assert(MinObjAlignmentInBytes == MinObjAlignment * HeapWordSize,
"ObjectAlignmentInBytes value is incorrect");
MinObjAlignmentInBytesMask = MinObjAlignmentInBytes - 1;
LogMinObjAlignmentInBytes = exact_log2(ObjectAlignmentInBytes);
LogMinObjAlignment = LogMinObjAlignmentInBytes - LogHeapWordSize;
// Oop encoding heap max
OopEncodingHeapMax = (uint64_t(max_juint) + 1) << LogMinObjAlignmentInBytes;
}
inline uintx max_heap_for_compressed_oops() {
// Avoid sign flip.
if (OopEncodingHeapMax < MaxPermSize + os::vm_page_size()) {
return 0;
}
LP64_ONLY(return OopEncodingHeapMax - MaxPermSize - os::vm_page_size());
NOT_LP64(ShouldNotReachHere(); return 0);
}
(注:其中 (uint64_t(max_juint) + 1) 的值也被称为NarrowOopHeapMax,也就是2的32次方,0x100000000;
ObjectAlignmentInBytes在64位HotSpot上默认为8;
HeapWord在globalDefinitions.hpp里定义,大小跟一个char*一样;
HeapWordSize在同一个文件里定义,等于sizeof(HeapWord),在64位系统上值为8;
LogHeapWordSize也在同一文件里,在64位系统上定义为3)
跟踪一下里面几个参数的计算,在64位HotSpot上有,
C++代码
ObjectAlignmentInBytes = 8
MinObjAlignmentInBytes = 8
HeapWordSize = 8
MinObjAlignment = 1
MinObjAlignmentInBytesMask = 0x0111
LogMinObjAlignmentInBytes = 3
LogHeapWordSize = 3 // _LP64
LogMinObjAlignment = 0
OopEncodingHeapMax = 0x800000000 // 32GB
于是,前面提到的第2个条件在64位HotSpot VM上默认是:
C++代码
MaxHeapSize + MaxPermSize + os::vm_page_size() <= 32GB
os::vm_page_size()是操作系统的虚拟内存的分页大小,在Linux上等于sysconf(_SC_PAGESIZE)的值;在x86_64上的Linux默认分页大小为4KB.
MaxHeapSize的值基本上等于-Xmx参数设置的值(会根据分页大小、对齐等因素做调整)。
MaxPermSize就是perm gen设置的最大大小。
这下可以确认,在我现在用的环境里,当包括perm gen在内的GC堆大小在32GB - 4KB以下的时候,使用64位的JDK 6 update 23或更高版本就会自动开启UseCompressedOops功能
分享到:
相关推荐
java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8Windows64位java的JDK1.8...
总之,"windows的64位操作系统下的java的jdk17安装包"提供了在64位Windows系统上开发和运行Java应用所需的全部工具,它包含了许多新的特性和改进,旨在提高开发效率和应用程序性能。正确安装并配置JDK 17后,开发者...
JDK 17是Oracle公司发布的Java SE(Standard Edition)的一个版本,适用于64位操作系统。这个版本旨在提供更稳定、安全和高效的开发环境,对于Java开发者来说具有重要意义。 JDK 17的主要亮点和改进包括: 1. **...
Java 64位JDK是Java Development Kit的64位版本,专为Windows操作系统设计。在深入探讨这个主题之前,我们需要理解几个基本概念。 首先,Java JDK是开发和运行Java应用程序所需的核心组件,包括Java编译器(javac)...
这里提到的是适用于64位操作系统的版本,即"javajdk for 64位",具体为"jdk-8u161-windows-x64"。这个版本的JDK适用于Windows操作系统,并且是为64位架构设计的,能够充分利用64位系统的计算能力。 Java JDK包含了...
Java JDK 17 (32位Windows系统)是Oracle公司为Windows操作系统提供的Java开发工具包的一个版本,专门针对32位架构。这个版本包含了Java编译器、Java运行时环境、Java类库以及相关的开发工具,是Java开发者进行程序...
以下是关于Java JDK 1.8的一些关键知识点,特别是针对64位和32位系统的差异: 1. **Java版本**:Java 1.8是Oracle公司发布的Java平台标准版(Java SE)的一个版本,也被称为Java 8。这个版本在2014年发布,引入了...
在安装Java JDK 1.8 64位时,你需要配置环境变量`JAVA_HOME`指向JDK的安装路径,并在`PATH`变量中添加`%JAVA_HOME%\bin`,以便系统能够找到Java命令。完成安装后,你可以通过`java -version`命令来检查Java是否正确...
综上所述,JDK1.6 32位版本适合于处理内存需求较低、运行在32位操作系统上的应用程序,而64位版本则适用于需要更大内存、更高效性能以及运行在64位操作系统上的应用程序。在"压缩包子文件的文件名称列表"中,我们...
注意选择32位还是64位版本,根据你的计算机系统来决定。 2. **运行安装程序**:下载完成后,双击下载的.exe文件,启动安装向导。按照提示进行下一步操作,通常包括接受许可协议,选择安装目录等。 3. **配置环境...
Oracle公司是Java的主要提供商,其官网提供了不同版本的JDK供用户下载,包括32位和64位,以满足不同的系统需求。"五毒"一词可能是打字错误,通常应理解为“无毒”,意味着这是官方提供的安全下载链接,不包含任何...
这里的"jdk1.7(64位)"指的是JDK的1.7版本,也被称为Java 7,且是针对64位操作系统的版本。这个版本对于开发者来说非常重要,因为它引入了许多新特性和改进,使得编程更加高效和灵活。 1. **Java 7的新特性**: -...
- **解压与设置路径**:下载JDK8的Windows 64位压缩文件后,解压到任意目录,如`C:\Program Files\Java`,然后将该路径添加到系统的PATH环境变量中。 - **验证安装**:打开命令行,输入`java -version`,如果正确...
在这个特定的案例中,我们讨论的是"jdk1.7 64位 解压缩版",这意味着它是针对64位操作系统设计的JDK1.7版本,无需安装,只需解压即可使用。 JDK1.7,也被称为Java 7或Java SE 7(Java Standard Edition 7),是...
在标题"jdk1.8 64位 解压缩版"中,"64位"指的是这个JDK版本是专为64位操作系统设计的,它可以更好地利用现代计算机的硬件资源,尤其是对于处理大量数据或内存消耗大的应用来说,64位JDK可以提供更好的性能。"解压缩...
Java JDK 1.8是Java开发工具包的一个重要版本,专为64位Windows操作系统设计。这个版本在Java开发领域中具有广泛的使用,因为它包含了编译、调试、性能优化等多方面的工具,使得开发者能够有效地编写、测试和运行...
这个版本的JDK包含了编译、调试、性能优化等Java开发所需的各种组件,使得开发者能够在Windows 64位环境下进行高效且稳定的Java编程。 1. **JDK 1.8的主要特性:** - **Lambda表达式**:这是Java 8最显著的新特性...
Java-JDK1.8-windows-x64位——免费不要积分!!! Java-JDK1.8-windows-x64位——免费不要积分!!! Java-JDK1.8-windows-x64位——免费不要积分!!! Java-JDK1.8-windows-x64位——免费不要积分!!! Java-JDK...
这个压缩包"java-jdk1.8-jdk-8u181-windows-x64.zip"内包含两个文件:一个是主安装程序“jdk-8u181-windows-x64.exe”,用于在Windows 64位系统上安装JDK 1.8的更新181版本;另一个是“使用说明.txt”,通常会提供...
这个版本的JDK是预编译和打包好的,用户只需解压缩文件,无需安装过程,就可以直接使用,极大地简化了在Windows XP系统上配置Java开发环境的步骤。 【JDK 1.8.0详解】 JDK是Java语言的核心组件,由Oracle公司提供...