Java如何保留/使用内存?

Java如何保留/使用内存?,java,macos,jvm,Java,Macos,Jvm,这可能是一个noob问题,但我需要运行一个处理大型数据集的java应用程序。所以我选择了-Xmx14G,因为我知道我的机器有16G的物理内存 过了一会儿,砰的一声,我的操作系统通知我启动盘快满了。我检查了我的进程,没有OOM异常,只是它停止了。检查了我的活动监视器,没有显示应用程序以满内存运行 JVM如何保留/使用内存?通常,JVM分配新内存直到堆满,在这种情况下,它会进行垃圾收集,释放未引用的对象。如果为堆分配了14GB,很可能它会消耗那么多内存。还有另一个JVM参数-Xms它的初始堆大小。如

这可能是一个noob问题,但我需要运行一个处理大型数据集的java应用程序。所以我选择了-Xmx14G,因为我知道我的机器有16G的物理内存

过了一会儿,砰的一声,我的操作系统通知我启动盘快满了。我检查了我的进程,没有OOM异常,只是它停止了。检查了我的活动监视器,没有显示应用程序以满内存运行


JVM如何保留/使用内存?

通常,JVM分配新内存直到堆满,在这种情况下,它会进行垃圾收集,释放未引用的对象。如果为堆分配了14GB,很可能它会消耗那么多内存。

还有另一个JVM参数
-Xms
它的初始堆大小。如果我们不显式地设置它,JVM将根据PC配置自动选择一个。这个值从来没有那么大,通常是64M。以后JVM可能会分配更多的内存,最大分配量为。但只有当应用程序真正使用它时才会发生这种情况。如果实际内存使用量减少,JVM会将内存缩小到较小的大小。

其他所有东西都在使用多少内存?在大多数现代操作系统上使用存储时,系统会在磁盘上为存储分配“交换空间”,以便在必要时“分页”该存储并“分页”另一个进程。具体如何实现这一点取决于操作系统——我认为Windows只分配了一个交换区,但Linux可能会为每个进程分配一个空间。这听起来像是OS X急于确保交换中的内存容量/备份。OTOH,Linux相当愿意:“过度分配指的是在不保证物理存储存在的情况下分配虚拟内存的做法”(但Linux当然不是OS X,我找不到任何地方表明OS X允许过度分配)。不确定您是否正在使用某些IDE开发此应用程序并对其进行大量调试。那么过一段时间再清理项目就不会有什么坏处了。只是猜测tho.related:(它使用的不仅仅是堆,不要给它一个接近实际可用ram大小的最大堆)