我有一个使用DOM处理大型XML文件的Java控制台应用程序。基本上,它从数据库中获取数据创建XML文件。 现在,正如你所猜测的那样,它使用了大量的内存,但令我惊讶的是,这与糟糕的代码无关,而与“java堆空间不收缩”有关。 我尝试使用以下JVM参数从Eclipse运行我的应用程序:
-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20
我甚至添加了
-XX:-UseSerialGC
我发现并行GC忽略“MinHeap”和“MaxHeap”选项。即使使用了所有这些选项,我的应用程序内存使用情况的图形如下所示:
![java app graph](https://istack.dev59.com/Q38bL.webp)
**有没有办法强制JVS将可用堆大小缩小到当前已用堆的150%?**比如,如果我的应用程序需要15MB的内存,则堆大小为20MB;当我的应用程序请求400MB的内存时,堆增长到600MB,重型操作完成后,堆大小立即降至20MB?