首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java获取可用内存

Java获取可用内存
EN

Stack Overflow用户
提问于 2012-10-10 04:19:14
回答 6查看 94.4K关注 0票数 85

有没有什么好方法可以让JVM在运行时使用剩余的内存?这样做的用例是,当web服务接近内存限制时,它们会通过拒绝新连接来优雅地失败,并显示一条漂亮的错误消息"too many using this,try later",而不是突然死于OutOfMemory错误。

注意:这与预先计算/估计每个对象的成本无关。原则上,我可以估计我的对象占用了多少内存,并基于这个估计拒绝新的连接,但这似乎有点老生常谈/很脆弱。

EN

回答 6

Stack Overflow用户

发布于 2016-04-11 02:03:27

要获得操作系统范围内的可用内存,请使用以下maven依赖项添加OSHI

代码语言:javascript
复制
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>LATEST</version>
</dependency>

然后在Java中,使用以下代码:

代码语言:javascript
复制
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
long availableMemory = hal.getMemory().getAvailable();
票数 10
EN

Stack Overflow用户

发布于 2012-10-10 07:11:04

除了使用Runtime方法之外,还可以使用以下命令获取一些额外的内存信息

代码语言:javascript
复制
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heap = memBean.getHeapMemoryUsage();
MemoryUsage nonheap = memBean.getNonHeapMemoryUsage();

每个MemoryUsage都提供初始化、使用、提交和最大值。如果创建一个内存监视器线程来轮询内存并记录它,向您提供一段时间内内存使用的历史记录,这可能会很有用。有时,查看导致错误的一段时间内的内存使用情况会很有帮助。

如果你真的想把这一点发挥到极致,那就创建一个堆转储线程。监控一段时间内的内存使用情况,当它超过特定阈值时,请执行以下操作(这适用于JBoss 5.0 -您的里程可能会有所不同):

代码语言:javascript
复制
// init code
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
HotSpotDiagnosticMXBean diagBean = ManagementFactory.newPlatformMXBeanProxy(server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class); 

// loop code
// add some code to figure if we have passed some threshold, then

File heapFile = new File(outputDir, "heap-" + curThreshold + ".hprof");
log.info("Dumping heap file " + heapFile.getAbsolutePath());
diagBean.dumpHeap(heapFile.getAbsolutePath(), true);

稍后,您可以使用eclipse memory analyzer或类似的工具检查这些堆转储文件,以检查内存泄漏等。

票数 8
EN

Stack Overflow用户

发布于 2012-10-10 04:25:23

除了另一个答案,我想指出这样做不一定是一个好主意,因为你的应用程序中可能有一个使用SoftReferences的缓存。

这样的缓存将在JVM达到其内存限制时立即释放内存。分配内存,即使没有足够的空闲内存,也会首先导致软引用释放内存,并使其可用于分配。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12807797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档