默认HotSpot最大直接内存大小

在我以前的博客文章热点选项中的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

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

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

相关文章

window 下 Atom 侧边栏字体大小设置

在 File 处找到 Settings 点击找到 Themes 点击找到 your stylesheet 点击在 .tree-view 处设置即可, (按照 css 样式来写即可保存生效)。转载于:https://www.cnblogs.com/zhourongcode/p/8521317.html

php workman 多线程,workerman如何多线程

Workerman有一个依赖pthreads扩展的MT多线程版本,但是由于pthreads扩展还不够稳定,所以这个Workerman多线程版本已经不再维护。 (推荐学习: workerman教程)workerman\mqtt 是一个基于workerman的异步mqtt 客户端库,可用于接收或者…

python面向对象封装

封装是指将功能模块化,比如,我们写了一个求和函数就是封装,函数使用者不需要了解函数内部是如何实现求和的,只需要调用我们写好的函数就行了。把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块&#xff0…

Java嵌入oracle,Java插入Oracle Spatial空间数据

Java读取地理信息数据文件,并将其存入Oracle数据库。package file;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Res…

js Object的属性 Configurable,Enumerable,Writable,Value,Getter,Setter

对象的数据属性 Configurable,Enumerable,Writable,Value var person {} Object.defineProperty(person,name,{configurable:false,//能否使用delete、能否需改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true enumerable:false,//…

SpringBoot AutoConfiguration魔术如何工作?

在我以前的文章中, 为什么选择SpringBoot? 我们已经研究了如何创建SpringBoot应用程序。 但是您可能会也可能不会了解幕后发生的事情。 您可能想了解SpringBoot自动配置背后的魔力。 但是在此之前,您应该了解Spring的Conditional功能&#x…

linux常用网络命令详解,linux网络命令详解(鸟哥)

[rootlinux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae][-qX] [-r 檔案] [所欲擷取的資料內容]參數:-nn:直接以 IP 及 port number 顯示,而非主機名與服務名稱-i :後面接要『監聽』的網路介面,例如 et…

Bzoj2694/Bzoj4659:莫比乌斯反演

Bzoj2694/Bzoj4659:莫比乌斯反演先上题面:首先看到这数据范围显然是反演了,然而第三个限制条件十分不可做。于是我们暂且无视他,大不了补集转化算完再减是吧。于是我们有:这里我们定义:于是这个东西我们可以nlogn筛的说。也就是说,我们求出f的…

linux系统嵌入式编译环境,Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解...

Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4.4.3 交叉编译器下载 见这篇文章http://www.linuxidc.com/Linux/2011-05/35906.htm安装前的絮叨首先简单介绍一下,所谓的搭建交叉编译环境&#xff0…

JUnit 5 –下一代JUnit的初步了解

2月初, JUnit 5(又名JUnit Lambda)团队发布了一个alpha版本。 由于JUnit 4是我工具箱中使用最频繁的项目之一,因此我认为值得一看下一个主要版本。 我试用了最新版本,并记下了我在这里发现值得注意的更改。 安装JUni…

Geany——Python配置

Geany是一个很不错的编辑器,操作很简单,这里记录一下Geany的入手设置(在下是一个Python程序猿,就以Python为例): 1:新建:选择 下拉菜单中的 main.py ,然后就能生成Pyth…

linux权限drwx,linux权限基础知识详解

祥哥今天整理一下Linux系统中的权限到底是什么?什么是775?什么又是777?664又代表了什么?1.查看权限可以使用ls -l命令ls -l我们以root文件夹为例来说明:drwx------.2 root rootd:这个代表是目录,也就是文件…

cargo maven_用于集成测试的Maven Cargo插件

cargo maven在项目生命周期中,非常普遍的需求是设置集成测试。 幸运的是,Maven在默认构建生命周期的以下阶段(来自Maven 文档 )具有对这一确切方案的内置支持: 集成前测试 : 执行集成测试之前所需的操作。…

linux菜单系统,Linux修改grub菜单

1. 保留上一次 grub 菜单选项1.1 问题每次开机时,大部分 Linux 发行版的 grub 菜单都是定位在首选项位置(即当前系统选项位置)。这就导致如果我们电脑安装了多个系统,那么每次开机进入其他系统都要重新选择 grub 菜单选项。而我们一般都是一段时间固定使…

zookeeper zoo.cfg配置文件

一、zookeeper的配置文件 zoo.cfg 配置文件是我们安装zookeeper的时候复制 重命名出来的文件命令: cp zoo_smaple.cfg zoo.cfgzkServer.sh 获取执行进入zookeeper 查看配置文件cd /myapp/zookeeper/conf执行命令 查看配置文件信息命令:vim zoo.cfg这是…

与Spring和Maven签订合约优先SOAP服务

1.简介 在本教程中,我们将学习使用JAX-WS,Spring和Maven实施合同优先的SOAP服务应用程序。 这是使用合同优先还是代码优先方法的更多设计决定。 在开发基于SOAP的Web服务应用程序时使用应用合同优先的方法最显着的好处是,可以在对合同进行必…

linux 下c内存管理,linux内存管理之malloc

对于内核的内存管理,像kmalloc,vmalloc,kmap,ioremap等比较熟悉。而对用户层的管理机制不是很熟悉,下面就从malloc的实现入手.( 这里不探讨linux系统调用的实现机制. ) ,参考了《深入理解计算机系统》和一些网上的资料…

jqGrid 常用方法

方法名参数返回值说明addJSONDatadatanone使用传来的data数据填充表格。使用方法: var mygrid jQuery(”#”grid_id)[0]; var myjsongrid eval(”(”jsonresponse.responseText”)”); mygrid.addJSONData(myjsongrid); myjsongrid null; jsonresponse null;addR…

新生必会的linux命令,jstat命令详解

导读Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控…

基于jsf的项目_JSF基于事件的交流:新派方法

基于jsf的项目在上一篇文章中 ,我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它们的缺点,我想展示基于事件的通信的更有效方法。 我们将从Google Guava EventBus开始,最后以CDI (Java EE平台的上…