Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时获取JVM可用的内存_Java_Sorting - Fatal编程技术网

Java 在运行时获取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可用的内存,并且处理这些数据需要外部排序,这比快速排序慢得多


是否有任何方法可以在运行时获取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()

实际上,您需要解决一些问题:

  • 您需要计算在给定的内存字节数中要容纳多少应用程序对象。顺便说一句,在运行中的应用程序中没有简单/有效的方法来实现这一点

  • 您不想尝试使用所有可用堆空间。如果将堆驻留百分比推得太高,则可能会使GC的效率极低


  • maxMemory()
    方法只告诉您虚拟内存中的堆有多大。物理大小也可以是一个因素(特别是如果物理大小使用运行时方法(如其他方法所建议的)是可以的,只要您考虑以下几点:

    1) freeMemory()是实际可用内存的下限,因为未引用且准备好进行GC的内存被视为已使用。在调用之前运行System.gc()可能会返回更准确的结果


    2) totalMemory()可以更改—它只指示当前的总堆大小,并且堆可以在运行时由JVM扩展/收缩,具体取决于其使用情况。您可以使用maxMemory()来获得实际的最大值。

    “…如果内存总量耗尽,您始终可以使用更大的堆启动JVM…”。没错,但是对于Java应用程序来说,像这样扩展自己的堆是个坏主意。@Stephen C:不太清楚你的意思。如果一个应用程序合理地需要更多的内存,那么增加分配的堆大小又有什么错呢?不。我的意思是如果该应用程序自行在一个具有更大堆的新JVM中重新启动自己。哇-我从来没有听说过应用程序会这样做。它怎么知道它已经用光了内存才能做到这一点呢?+1分。关于第1点,这里有一个可能的(复杂的)解决方案:。然而,在目前的情况下,估计就足够了。第(2)点和第(3)点对性能极为重要。