有没有什么好方法可以让JVM在运行时使用剩余的内存?这样做的用例是,当web服务接近内存限制时,它们会通过拒绝新连接来优雅地失败,并显示一条漂亮的错误消息"too many using this,try later",而不是突然死于OutOfMemory错误。
注意:这与预先计算/估计每个对象的成本无关。原则上,我可以估计我的对象占用了多少内存,并基于这个估计拒绝新的连接,但这似乎有点老生常谈/很脆弱。
发布于 2016-04-11 02:03:27
要获得操作系统范围内的可用内存,请使用以下maven依赖项添加OSHI
:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>LATEST</version>
</dependency>
然后在Java中,使用以下代码:
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
long availableMemory = hal.getMemory().getAvailable();
发布于 2012-10-10 07:11:04
除了使用Runtime方法之外,还可以使用以下命令获取一些额外的内存信息
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heap = memBean.getHeapMemoryUsage();
MemoryUsage nonheap = memBean.getNonHeapMemoryUsage();
每个MemoryUsage都提供初始化、使用、提交和最大值。如果创建一个内存监视器线程来轮询内存并记录它,向您提供一段时间内内存使用的历史记录,这可能会很有用。有时,查看导致错误的一段时间内的内存使用情况会很有帮助。
如果你真的想把这一点发挥到极致,那就创建一个堆转储线程。监控一段时间内的内存使用情况,当它超过特定阈值时,请执行以下操作(这适用于JBoss 5.0 -您的里程可能会有所不同):
// 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或类似的工具检查这些堆转储文件,以检查内存泄漏等。
发布于 2012-10-10 04:25:23
除了另一个答案,我想指出这样做不一定是一个好主意,因为你的应用程序中可能有一个使用SoftReferences的缓存。
这样的缓存将在JVM达到其内存限制时立即释放内存。分配内存,即使没有足够的空闲内存,也会首先导致软引用释放内存,并使其可用于分配。
https://stackoverflow.com/questions/12807797
复制相似问题