指示JVM像普通进程一样使用内存吗?

时间:2016-05-03 12:29:48

标签: java jvm

我完全厌倦了,不得不为-Xmx命令行选项猜测一个好的值,让我的应用程序因OutOfMemoryException而崩溃,必须修改-Xmx值,并且必须一直重新启动我的应用程序。

有没有办法让JVM正常运行,以便它不需要-Xmx选项,并且可以直接从操作系统分配和free 内存,就像任何正常的应用程序一样?是否有一些GC更高效,在释放对象时积极地将内存返回给操作系统?

如果我没记错的话,Java的根源在于嵌入式环境,但是它早已越来越受欢迎并且已经扩展到各种系统。当然,在21世纪必须有办法做到这一点吗?有许多用例,应用程序可能需要从几千字节到几兆兆字节的内存,而繁琐的-Xmx实际上正在阻碍。

(提醒自己:由于没有好的答案,以cargo cult方式迭代尝试其他一些GC-s和随机命令行选项)

2 个答案:

答案 0 :(得分:2)

  

有没有办法让JVM正常运行,以便它不需要-Xmx选项,并且可以直接从操作系统分配和释放内存,就像任何普通应用程序一样?

这是默认情况下的作用。您只需要设置最大堆大小,以指示您希望在何时获得错误而不是使用更多内存。

  

是否有一些GC更高效,在释放对象时积极地将内存返回给操作系统?

我相信Oracle JVM中的G1收集器在这方面更好(因为它更新?)

  

如果我没记错的话,Java的根源在于嵌入式环境,

它的根源是Java小程序。 J2ME用于嵌入式系统,这是一个不同的版本和代码库。

  

繁琐的-Xmx确实妨碍了。

我通常不会自己设定。如果您有128 GB或更多,则默认为32 GB。

答案 1 :(得分:0)

  

由于没有好的答案,所以在货物崇拜时代迭代尝试其他一些GC-s和随机命令行选项

另一种方法是了解GC如何工作以及它们的性能权衡取舍以及这些参数如何影响它们,然后根据这些信息而不是随机选择它们。

该主题有extensive documentation

当然,你仍然可以使用SO答案作为起点,找到可能导致你想要的结果的选项,但是没有什么可以阻止你研究为什么他们取得了这些成果。

无需崇拜飞机。