当前位置: 首页 > 知识库问答 >
问题:

Java内存:jstat vs Runtime。getRuntime()。freeMemory();

齐昊
2023-03-14

我正在运行一个java应用程序,我观察到如下情况:

通过代码我正在计算内存利用率:

long freeMemory = Runtime.getRuntime().freeMemory();
this.memUsage = 100f - (freeMemory*100)/this.maxMemory;
where
instance.maxMemory = Runtime.getRuntime().maxMemory();

时间戳S0 S1 E O P YGC YGCT FGC FGCT GCT

2849.6 0.00 84.80 93.14 16.95 60.00 483 140.140 8 3.649 143.789

首先,我的代码将显示哪个内存。老人、伊甸园或幸存者。我觉得老了。。m i rgt??

在特定的时候,我观察到我的代码与jstat旧的内存利用率相比给了我不同的输出。就像这里的jstat old show大约17%,我的代码显示20%。有什么原因吗??

共有1个答案

严永丰
2023-03-14

据我所知,运行时内存方法仅将HEAP报告为总数(因此所有值都是old、eden、生存者和永久值的总数)。这就是为什么您的值会关闭,因为没有jstat输出告诉您整个堆利用率。

关于Runtime.freeMemory()需要注意的一点是,它可能并不完全准确。来自方法的javadoc:

返回当前可用于未来分配对象的内存总量的近似值,以字节为单位。

我倾向于不信任从运行时类返回的关于内存的任何值。可以使用jconsole或jstat之类的外部命令来获取内存统计信息,也可以在启动java程序时使用Xloggc。这些方法在监视内存使用方面比我见过的任何API方法都要可靠得多。

 类似资料:
  • 我正在尝试将我制作的两个简单程序合并为一个。罐子我两个都打包了。将jar装入新的jar并在运行时使用。getRuntime()。exec方法来执行它们。 代码: 问题是只执行proj1.jar,proj2.jar不运行。我是新来的java,不知道为什么会这样。我该怎么解决这个问题?我想要两个文件都被执行。

  • 问题内容: 因此,我们有一个作为Windows服务运行的Java进程。它需要使用执行命令。它执行的命令需要UAC。这是在Windows Server 2008上,听起来您无法为单个可执行文件禁用UAC,所以还有其他方法可以使这项工作吗? 问题答案: 如果您的Java应用程序作为Windows服务运行,则它很可能在以下系统帐户之一下运行:SYSTEM(最有可能),LOCAL SERVICE或NETW

  • 是否有可能在内存中实现缓存以避免完全堆消耗? 我的spring boot java应用程序使用内存缓存,过期策略设置为1小时(咖啡因库用于缓存目的)。在此之后,所有缓存实例都处于旧代,需要收集完整的GC。现在,当XMX设置为10GB时,我可以看到经过几个小时的测试,我的缓存包含大约100k个实例,但在heap中(正好是旧一代),我可以找到数百万个缓存对象的实例。是否有可能在内存中使用缓存并避免这种

  • 问题内容: 一个简单的,可能是愚蠢的问题:假设我有一个Java服务器,该服务器在内存中存储了我可以查询的常用键和值(比如说在HashMap中) 与使用Memcache(甚至是Redis)有什么区别?它们都将事物存储在内存中。一个或另一个有好处吗?Memcache是​​否会减少内存占用量?可以在更少的内存中存储更多内容吗?查询更快?没有不同? 问题答案: Java内存相对于Memcache的优势:

  • 问题内容: 我如何在运行时从字符串生成字节码(Byte []),而无需使用“ javac”进程或类似的东西?有没有像这样调用编译器的简单方法? 以后添加: 我选择接受最适合 我的 情况的解决方案。我的应用程序是一个尚处于设计草图阶段的业余项目,现在是考虑插入新技术的合适时机。另外,由于应该帮助我解决BL的人是JavaScript开发人员,因此在这种情况下,使用JavaScript解释器而不是存根编

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM