hotspot 默认 gc_默认HotSpot最大直接内存大小

hotspot 默认 gc

在我以前的博客文章热点选项中的Java 8改进的文档 ,我写的误解围绕热点JVM非标准的默认设置选项 -XX:MaxDirectMemorySize 。 在本文中,我介绍了一种确定HotSpot JVM中“默认”最大直接内存大小的简单方法。

Java启动器的Java 8文档对-XX:MaxDirectMemorySize声明了以下内容(我强调了 ):

设置新I / O( java.nio程序包)直接缓冲区分配的最大总大小(以字节为单位)。 字母kK表示千字节, mM表示兆字节, gG表示千兆字节。 默认情况下,大小设置为0,这意味着JVM会自动为NIO直接缓冲区分配选择大小。

上面解释了,如果没有通过-XX:MaxDirectMemorySize选项明确指定大小,则HotSpot中最大直接内存大小的默认值为0 。 在这种情况下,使用-XX:+ PrintFlagsInitial和-XX:+ PrintFlagsFinal之类的选项无济于事,因为当未明确指定时,这些值也将显示为零。 例如,运行java -XX:+PrintFlagsFinal -version显示:

size_t MaxDirectMemorySize                       = 0

据我所知,没有“标准”方式来访问最大直接内存大小。 类java.lang.Runtime提供有关JVM中的近似可用内存,JVM中的总内存以及JVM将尝试使用的最大内存的信息 。 尽管java.lang.management.MemoryMXBean除了提供堆内存使用之外还提供了非 堆内存使用 ,但是这种非堆使用是指“方法区域”,也可能是实现的“内部处理或优化”,而不是直接用于内存。

有一些非标准的方法来确定一个人的HotSpot JVM默认的最大内存大小。 在StackOverflow线程中, 有没有一种方法可以测量Java中的直接内存使用情况? whiskeyspider撰写了有关sun.misc.SharedSecrets.getJavaNioAccess()。getDirectBufferPool()。getMemoryUsed()‌和sun.misc.VM.maxDirectMemory()的文章 。 这些特定于HotSpot的类分别指示正在使用的直接内存量和可以使用的最大直接内存量。

sun.misc.SharedSecrets类通过方法调用getJavaNioAccess().getDirectBufferPool()来访问sun.misc.JavaNioAccess.BufferPool的实例,提供有关直接内存使用的信息。 BufferPool接口定义了三种提供直接内存相关详细信息的方法: getCount()getTotalCapacity()getMemoryUsed() 。 尽管这些方法提供了有关直接内存使用的有趣信息,但它们并没有告诉我们最大直接内存是多少。

HotSpot JVM中的sun.misc.VM.maxDirectMemory()方法为我们提供最大直接内存,无论它是使用-XX:MaxDirectMemorySize=显式指定的,还是隐式设置为-XX:MaxDirectMemorySize=0 (默认值) VM选择直接内存的最大大小。

为了帮助演示使用这些方法确定最大直接内存和使用的直接内存,我首先介绍一个将在示例中使用的实用程序。 这个enum被命名为MemoryUnit ,并且适用于ustin.utilities.memory.MemoryUnit.java中的这篇文章。 我本可以使用Apache Commons的FileUtils.byteCountToDisplaySize(long)或Brice McIver对其进行的更精细的修改 ,但决定使用这个简单的TimeUnit – 启发性的 enum ,如下所示。

MemoryUnit.java

package dustin.examples.maxdirectmemory;/*** Representation of basic memory units.*/
public enum MemoryUnit
{/** Smallest memory unit. */BYTES,/** "One thousand" (1024) bytes. */KILOBYTES,/** "One million" (1024x1024) bytes. */MEGABYTES,/** "One billion" (1024x1024x1024) bytes. */GIGABYTES;/** Number of bytes in a kilobyte. */private final double BYTES_PER_KILOBYTE = 1024.0;/** Number of kilobytes in a megabyte. */private final double KILOBYTES_PER_MEGABYTE = 1024.0;/** Number of megabytes per gigabyte. */private final double MEGABYTES_PER_GIGABYTE = 1024.0;/*** Returns the number of bytes corresponding to the* provided input for a particular unit of memory.** @param input Number of units of memory.* @return Number of bytes corresponding to the provided*    number of particular memory units.*/public double toBytes(final long input){double bytes;switch (this){case BYTES:bytes = input;break;case KILOBYTES:bytes = input * BYTES_PER_KILOBYTE;break;case MEGABYTES:bytes = input * BYTES_PER_KILOBYTE * KILOBYTES_PER_MEGABYTE;break;case GIGABYTES:bytes = input * BYTES_PER_KILOBYTE * KILOBYTES_PER_MEGABYTE * MEGABYTES_PER_GIGABYTE;break;default :throw new RuntimeException("No value '" + this + "' recognized for enum MemoryUnit.");}return bytes;}/*** Returns the number of kilobytes corresponding to the* provided input for a particular unit of memory.** @param input Number of units of memory.* @return Number of kilobytes corresponding to the provided*    number of particular memory units.*/public double toKiloBytes(final long input){double kilobytes;switch (this){case BYTES:kilobytes = input / BYTES_PER_KILOBYTE;break;case KILOBYTES:kilobytes = input;break;case MEGABYTES:kilobytes = input * KILOBYTES_PER_MEGABYTE;break;case GIGABYTES:kilobytes = input * KILOBYTES_PER_MEGABYTE * MEGABYTES_PER_GIGABYTE;break;default:throw new RuntimeException("No value '" + this + "' recognized for enum MemoryUnit.");}return kilobytes;}/*** Returns the number of megabytes corresponding to the* provided input for a particular unit of memory.** @param input Number of units of memory.* @return Number of megabytes corresponding to the provided*    number of particular memory units.*/public double toMegaBytes(final long input){double megabytes;switch (this){case BYTES:megabytes = input / BYTES_PER_KILOBYTE / KILOBYTES_PER_MEGABYTE;break;case KILOBYTES:megabytes = input / KILOBYTES_PER_MEGABYTE;break;case MEGABYTES:megabytes = input;break;case GIGABYTES:megabytes = input * MEGABYTES_PER_GIGABYTE;break;default:throw new RuntimeException("No value '" + this + "' recognized for enum MemoryUnit.");}return megabytes;}/*** Returns the number of gigabytes corresponding to the* provided input for a particular unit of memory.** @param input Number of units of memory.* @return Number of gigabytes corresponding to the provided*    number of particular memory units.*/public double toGigaBytes(final long input){double gigabytes;switch (this){case BYTES:gigabytes = input / BYTES_PER_KILOBYTE / KILOBYTES_PER_MEGABYTE / MEGABYTES_PER_GIGABYTE;break;case KILOBYTES:gigabytes = input / KILOBYTES_PER_MEGABYTE / MEGABYTES_PER_GIGABYTE;break;case MEGABYTES:gigabytes = input / MEGABYTES_PER_GIGABYTE;break;case GIGABYTES:gigabytes = input;break;default:throw new RuntimeException("No value '" + this + "' recognized for enum MemoryUnit.");}return gigabytes;}
}

使用MemoryUnit作为帮助程序实用程序,下一个代码示例演示如何使用SharedSecrets提供的JavaNioAccess.BufferPool上的方法。 这些值不是最大可能的直接内存,而是对已经使用的直接内存的估计。

/*** Write amount of direct memory used to standard output* using SharedSecrets, JavaNetAccess, the direct Buffer Pool,* and methods getMemoryUsed() and getTotalCapacity().*/
public static void writeUsedDirectMemoryToStdOut()
{final double sharedSecretsMemoryUsed =MemoryUnit.BYTES.toMegaBytes(SharedSecrets.getJavaNioAccess().getDirectBufferPool().getMemoryUsed());out.println("sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getMemoryUsed(): "+ sharedSecretsMemoryUsed + " MB");final double sharedSecretsTotalCapacity =MemoryUnit.BYTES.toMegaBytes(SharedSecrets.getJavaNioAccess().getDirectBufferPool().getTotalCapacity());out.println("sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getTotalCapacity(): "+ sharedSecretsTotalCapacity + " MB");
}

将类似以下内容的行放入直接存储器后,即可执行以上代码:

final ByteBuffer bytes = ByteBuffer.allocateDirect(1_000_000);

如上所示使用直接内存并执行上面的代码时,输​​出如下所示:

sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getMemoryUsed(): 0.95367431640625 MB
sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getTotalCapacity(): 0.95367431640625 MB

刚刚演示的方法提供了使用的直接内存量的估计,但仍未显示最大可用直接内存。 可以使用VM.maxDirectMemory确定,如下面的代码清单所示。

/*** Write maximum direct memory size set (explicitly or* implicitly) for this VM instance using VM's* method maxDirectMemory().*/
public static void writeMaximumDirectMemorySizeToStdOut()
{final double vmSize =MemoryUnit.BYTES.toMegaBytes(VM.maxDirectMemory());out.println("sun.misc.VM.maxDirectMemory(): " + vmSize + " MB");
}

当以上代码在我的笔记本电脑上使用JDK 8执行且未明确指定-XX:MaxDirectMemorySize ,结果如下所示:

sun.misc.VM.maxDirectMemory(): 1804.5 MB

由此可见,我的机器上运行的JVM的默认最大直接内存大小约为1.8 GB。 我知道这是默认值,因为我没有在命令行上显式指定-XX:MaxDirectMemorySize ,并且因为使用-XX:+ PrintFlagsFinal运行示例Java应用程序时显示为零(默认值)。

为了确保自己这种方法显示的是正确的最大直接内存,我可以在命令行上显式指定最大直接内存,并查看上面显示的代码写了什么。 在这种情况下,我在命令行上提供-XX:MaxDirectMemorySize=3G 。 这是我使用显式设置运行上述代码时的输出:

sun.misc.VM.maxDirectMemory(): 3072.0 MB

结论

当需要知道可在HotSpot JVM上运行的特定应用程序使用的最大直接内存时 ,如果未明确指定-XX:MaxDirectMemorySize ,则方法VM.maxDirectMemory()可能是获取此信息的最简单方法。 当直接使用Java NIO时 ,甚至当使用Java NIO的产品(例如Terracotta和Hazelcast “ offheap”选项)间接使用Java NIO时,了解允许的最大直接内存将很有用。

翻译自: https://www.javacodegeeks.com/2016/02/default-hotspot-maximum-direct-memory-size.html

hotspot 默认 gc

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

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

相关文章

python控制电脑休眠唤醒键_每当计算机从休眠状态唤醒时,都运行python脚本

我在python上编写了一个小脚本,该脚本从控制台调用命令行以使linux机器休眠(或在更改一个单词的情况下将其自身关闭),然后在一段时间后唤醒.通过watch命令一次又一次地调用该命令.import osimport timeos.system("watch -n 20 sudo rtcwake -u -s 10 -m mem")因此,在…

sso集成shiro_Keycloak SSO集成到jBPM和Drools Workbench中

sso集成shiro介绍 单一登录(SSO)和相关令牌交换机制正在成为Web上不同环境中身份验证和授权的最常见方案,尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成,以便使用Keycloak上提供的所有功能。 Keycloak…

LeetCode 01. 两数之和

原题 分析: 1.根据题意,首先需要将要数据选择一个合适的 数据结构模型。 因为是对应相关联,所以我们选择unordered_map 2.因为是一组数,所以用数组 ,将数值与数组下标对应起来 3.已知两数之和,从数组第…

python中自带的模块_python中的模块详解

概念python中的模块是什么?简而言之,在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件。模块可以被项目中的其他模块、一些脚本甚至是交互式的解析器所使用&#xff0c…

剑指 Offer 51-----59

剑指 Offer 55 - I. 二叉树的深度 解题思路: class Solution { public:int maxDepth(TreeNode* root) {if(rootNULL)return 0;int lmaxDepth(root->left);int rmaxDepth(root->right);return (l>r?l:r)1;} };

jbpm 和 drools_jBPM和Drools工作台中的用户和组管理

jbpm 和 drools介绍 本文讨论了一项新功能,该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装,设置和使用此功能之前,本文讨论了一些以前的概念,需要进一步理…

剑指 Offer 01-----20

剑指 Offer 03. 数组中重复的数字 解题思路,使用STL中的set,逐个读入vector中的每一个元素,使用set进行对比,如果set中存在会返回1,这时直接返回该元素即可;如果set中没有可以insert这个元素到set&#xf…

python filter函数中写none_Python3基础 filter 第一个参数为NONE时 结果只返回为True的对象...

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-9-23Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""def main():# 过滤器# 通过 过滤…

从事java编程技能要求_5道Java视频课程,提高您的编程技能

从事java编程技能要求作为Web开发人员,跟上技术知识可能会很棘手。 新技术似乎每天都在弹出,而基本技术也看到了重复迭代的浪潮,增加了新的功能。 Java开发人员应该做什么? 这是在线教育平台发挥作用的地方。 它们可以帮助您快速…

常见算法核心思想

双指针算法 1.双指针算法主要是为了提高朴素算法的复杂度&#xff0c;即O(n^2)的算法&#xff0c;优化为O(n)的算法。 2.常见模板 for (int i 0, j 0; i < n; i ) {while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类&#xff1a;(1) 对于…

sqlserver存储过程加锁后怎么解锁_【缺陷周话】第59期:重复加锁

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01;*声明&#xff1a;《缺陷周话》栏目系列文章由奇安信代码卫士团队原创出品。未经许可&#xff0c;禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。代码审计是使用静态分析发现源代码中安全缺陷的方法&…

idea添加jboss_如何将云持久存储添加到JBoss Cool Store

idea添加jboss我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 上个月&#xff0c;我们带来了一个完整的零售示例&#xff0c;其中的JBoss Cool Store运行在您的堆栈的OpenShift Enterprise层上&…

【技术解决方案】优化FFmpeg探测网络流时间过长的问题

场景要求 项目要求点播速度是300到500毫秒之间&#xff0c;现在最长的点播延时是1300毫秒&#xff08;有的时候甚至无法播放视频&#xff09;&#xff0c;生产环境是RTSP传输H264裸流数据&#xff0c;研究在接收到I帧的时候&#xff0c;开始出来图像&#xff0c;简化FFmpeg的调…

python画各种统计图的特点_Python 分词并画出词频统计图 | 睿鑫网络

import turtle##全局变量###词频排列显示个数count 10#单词频率数组-作为y轴数据data []#单词数组-作为x轴数据words []#y轴显示放大倍数-可以根据词频数量进行调节yScale 2#x轴显示放大倍数-可以根据count数量进行调节xScale 30################# Turtle Start #########…

ssm影城项目_影场与属性访问器界面

ssm影城项目卡尔迪亚&#xff08;Carl Dea&#xff09;最近跟踪了我的一篇名为“ 保存内存”的博客文章&#xff01; 为属性使用阴影字段 。 在他的博客中&#xff0c;他建议使用称为“属性访问器”的接口来消除大量使用样板代码所需的样板代码。 卡尔还提到他尚未用大量数据测…

【技术解决方案】优化FFmpeg编码器参数设置

FFmpeg x264编码参数对照表 x264 ffmpeg 说明 命令行 字段 命令行 字段 qp qp_constant cqp cqp 固定量化因子。取值范围0到51。 经常取值在20-40之间&#xff0c;越小质量 越好,要求的码率越高。0表示无损压缩 max-keyint i_keyint_max g gop_size …

python version翻译_python实现在线翻译功能

对于需要大量翻译的数据&#xff0c;人工翻译太慢&#xff0c;此时需要使用软件进行批量翻译。1.使用360的翻译def fanyi_word_cn(string):url"https://fanyi.so.com/index/search"#db_path ./db/tasks.dbForm_Data {}#这里输入要翻译的英文Form_Data[query] string…

java流写入数据库_Java 8:在2分钟内将智能流与数据库一起使用

java流写入数据库快速流媒体 当Java 8最终问世时&#xff0c;我和一些大学开始了一个开源项目&#xff0c;以利用Java 8的流库使整个Java / DB问题更进一步&#xff0c;以便将数据库表视为纯Java 8流。 速度诞生了&#xff01; 哇&#xff0c;现在我们可以做类型安全的数据库应…

【技术解决方案】RTP_UDP传输过程中数据丢失的解决方案

1. 从发送端解决(推荐) 适用条件: ①发送端是可以控制的.②微秒数量级的延迟可以接受 解决方法:发送时使用usleep(1)延迟1微秒发送,即发送频率不要过快,延迟1微妙发送,可以很好的解决这个问题.。 2.从接收端解决方法一 适用条件:①无法控制发送端发送数据的频率 解决方法:…

方法参数泛型_无参数泛型方法反模式

方法参数泛型最近&#xff0c;有关Java泛型的一个非常有趣的问题发布到Stack Overflow和reddit上。 请考虑以下方法&#xff1a; <X extends CharSequence> X getCharSequence() {return (X) "hello"; }尽管这种不安全的转换看起来有些古怪&#xff0c;并且您…