Java 在运行时获取JVM可用的内存
我正在尝试对一组数据进行排序,以便输入到程序的数据的大小可以大于JVM可用的内存,并且处理这些数据需要外部排序,这比快速排序慢得多Java 在运行时获取JVM可用的内存,java,sorting,Java,Sorting,我正在尝试对一组数据进行排序,以便输入到程序的数据的大小可以大于JVM可用的内存,并且处理这些数据需要外部排序,这比快速排序慢得多 是否有任何方法可以在运行时获取JVM可用的内存,以便我可以尽可能多地使用就地排序,并且仅在数据输入太大时切换到Mergesort?在类上查看这些方法: 示例 Runtime rt = Runtime.getRuntime(); System.err.println(String.format("Free: %d bytes, Total: %d bytes,
是否有任何方法可以在运行时获取JVM可用的内存,以便我可以尽可能多地使用就地排序,并且仅在数据输入太大时切换到Mergesort?在类上查看这些方法: 示例
Runtime rt = Runtime.getRuntime();
System.err.println(String.format("Free: %d bytes, Total: %d bytes, Max: %d bytes",
rt.freeMemory(), rt.totalMemory(), rt.maxMemory()));
还请注意,如果内存总量正在耗尽,则始终可以使用-Xmx
JVM参数使用分配的较大堆启动JVM;e、 g
java -Xmx256M MyClass
您可以使用Runtime类获取可用内存量
Runtime r = Runtime.getRuntime();
System.out.println(r.totalMemory());
您还可以从Runtime对象获得各种其他内存详细信息-请参见。理论上是,使用
Runtime.getRuntime().maxMemory()
实际上,您需要解决一些问题:
maxMemory()
方法只告诉您虚拟内存中的堆有多大。物理大小也可以是一个因素(特别是如果物理大小使用运行时方法(如其他方法所建议的)是可以的,只要您考虑以下几点:
1) freeMemory()是实际可用内存的下限,因为未引用且准备好进行GC的内存被视为已使用。在调用之前运行System.gc()可能会返回更准确的结果
2) totalMemory()可以更改—它只指示当前的总堆大小,并且堆可以在运行时由JVM扩展/收缩,具体取决于其使用情况。您可以使用maxMemory()来获得实际的最大值。“…如果内存总量耗尽,您始终可以使用更大的堆启动JVM…”。没错,但是对于Java应用程序来说,像这样扩展自己的堆是个坏主意。@Stephen C:不太清楚你的意思。如果一个应用程序合理地需要更多的内存,那么增加分配的堆大小又有什么错呢?不。我的意思是如果该应用程序自行在一个具有更大堆的新JVM中重新启动自己。哇-我从来没有听说过应用程序会这样做。它怎么知道它已经用光了内存才能做到这一点呢?+1分。关于第1点,这里有一个可能的(复杂的)解决方案:。然而,在目前的情况下,估计就足够了。第(2)点和第(3)点对性能极为重要。