返回顶部
首页 > 资讯 > 精选 >JDK默认开启压缩指针问题怎么解决
  • 814
分享到

JDK默认开启压缩指针问题怎么解决

2023-06-17 13:06:25 814人浏览 八月长安
摘要

本篇内容介绍了“jdk默认开启压缩指针问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sun的HotSpot VM从JDK5开始会

本篇内容介绍了“jdk默认开启压缩指针问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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控制,会在下述条件满足的时候默认开启:

是64位系统(#ifdef _LP64)并且不是client VM(#ifndef COMPILER1);

Java堆的***大小不大于一个阈值(MaxHeapSize <= max_heap_for_compressed_oops());

没有通过.hotspotrc或命令行参数手动设定过UseCompressedOops参数的值;

没有使用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功能。

“JDK默认开启压缩指针问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: JDK默认开启压缩指针问题怎么解决

本文链接: https://lsjlt.com/news/289318.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JDK默认开启压缩指针问题怎么解决
    本篇内容介绍了“JDK默认开启压缩指针问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sun的HotSpot VM从JDK5开始会...
    99+
    2023-06-17
  • 更改JDK默认编码,解决DBeaver乱码问题
    之前存在,在DBeaver中添加汉字注释后,选择另存为后,注释的汉字出现乱码问题? 解决方法:在环境变量中添加JAVA_TOOL_OPTIONS选项,添加参数-Dfile.encoding=UTF-8 ...
    99+
    2024-04-02
  • 怎么解决php压缩中文乱码问题
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。怎么解决php压缩中文乱码问题?解决php使用ZipArchive解压时中文乱码问题(纯php,绕开ZipArchive)解决php使用ZipArchive解压时中文...
    99+
    2024-04-02
  • win11分区c盘压缩问题怎么解决
    本篇内容主要讲解“win11分区c盘压缩问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11分区c盘压缩问题怎么解决”吧!首先右键“此电脑”,打开“属性” 接着打开“相关链接”中...
    99+
    2023-07-02
  • IOS开发压缩后图片模糊问题解决
    目录前言I 图片压缩的两种方式II、 解决压缩之后图片模糊的问题2.1、如果是拍照,可以压缩一下分辨率,否则上传很慢2.2、 质量压缩(0.5) 结合比例压缩(1028)III 针对...
    99+
    2024-04-02
  • SpringBoot security默认拦截静态资源问题怎么解决
    这篇文章主要讲解了“SpringBoot security默认拦截静态资源问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot security...
    99+
    2023-07-05
  • 如何解决interval 分区表clob默认表空间指定问题
    这篇文章将为大家详细讲解有关如何解决interval 分区表clob默认表空间指定问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 ...
    99+
    2024-04-02
  • win10压缩文件拒绝访问怎么解决
    如果在Windows 10上压缩文件时遇到拒绝访问的问题,有几种可能的解决方法:1.以管理员身份运行压缩工具:右键点击压缩工具的图标...
    99+
    2023-09-12
    win10
  • MyBatisPlus不使用数据库默认值的问题怎么解决
    这篇“MyBatisPlus不使用数据库默认值的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatisPl...
    99+
    2023-07-02
  • mysql修改数据库默认路径无法启动问题的解决
    前言 mysql 修改数据库默认路径时出现服务无法启动,检查日志发现报文件权限的错误。 对于更改后的目录已经设置mysql为目录的owner啦呀!且命令行下直接启动数据库就一切正常。 祭出万能的Google...
    99+
    2024-04-02
  • Java代码引起的NATIVE野指针问题怎么解决
    Java代码引起的NATIVE野指针问题怎么解决,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实施hook:我们有了hook,但目前还不知道是哪个so中释放了f...
    99+
    2023-06-17
  • php重复开启session问题怎么解决
    在PHP中,如果重复开启session会导致出错或者session数据丢失。为了解决这个问题,可以使用session_id()函数来...
    99+
    2023-08-17
    php session
  • 如何解决Mongodb 3.2.9开启用户权限认证问题
    这篇文章给大家分享的是有关如何解决Mongodb 3.2.9开启用户权限认证问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、在老版的Mongodb(大概3.0以前)可以这样...
    99+
    2024-04-02
  • win10软件默认安装路径为C盘问题怎么解决
    本篇内容介绍了“win10软件默认安装路径为C盘问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win10软件默认路径为C盘解决方...
    99+
    2023-07-01
  • uni-app开发微信小程序之H5压缩上传图片的问题怎么解决
    这篇文章主要讲解了“uni-app开发微信小程序之H5压缩上传图片的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“uni-app开发微信小程序之H5压缩上传图片的问题怎么解决”吧...
    99+
    2023-07-05
  • 怎么解决linux解压rar 乱码问题
    本篇内容主要讲解“怎么解决linux解压rar 乱码问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决linux解压rar 乱码问题”吧!linux解压rar乱码的解决办法:1、安装RA...
    99+
    2023-06-22
  • rabbitmq消息积压问题怎么解决
    RabbitMQ消息积压问题通常是由以下几个原因引起的:1. 消费者速度慢:消费者处理消息的速度比生产者发送消息的速度慢,导致消息在...
    99+
    2023-10-09
    rabbitmq
  • Win7开机黑屏只有鼠标指针的问题如何解决
      有Win7系统用户反应,电脑开机启动后快登入到桌面的时候,开机黑屏有鼠标,久久都登入不上桌面。这种问题其实很常见,但造成这种情况的原因有很多种。以下就是出现这个问题的解决办法。   一、由于启动项过多导致系统启动缓...
    99+
    2023-06-16
    Win7 黑屏 鼠标指针 鼠标 问题 指针
  • 如何解决Ubuntu中修复默认启用HDMI后没有声音的问题
    本篇内容主要讲解“如何解决Ubuntu中修复默认启用HDMI后没有声音的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Ubuntu中修复默认启用HDMI后没有声音的问题”吧!声音问题...
    99+
    2023-06-16
  • windows中winrar无法打开rar压缩包怎么解决
    这篇文章主要介绍“windows中winrar无法打开rar压缩包怎么解决”,在日常操作中,相信很多人在windows中winrar无法打开rar压缩包怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”w...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作