Java:为什么它使用固定数量的内存?或者它如何管理内存?
JVM 似乎使用了一些固定的内存量。至少我经常看到参数(对于最大大小)和(对于初始大小)表明这一点。-Xmx
-Xms
我有一种感觉,Java应用程序不能很好地处理内存。我注意到的一些事情:
即使是一些非常小的示例演示应用程序也会加载大量内存。也许这是因为加载了Java库。但是,为什么需要为每个Java实例加载库呢?(似乎如此,因为多个小型应用程序线性地占用更多内存。有关我描述此问题的一些详细信息,请参阅此处。或者为什么这样做?
像Eclipse这样的大型Java应用程序经常会崩溃,并出现一些OutOfMemory异常。这总是很奇怪,因为我的系统上仍然有足够的内存可用。通常,它们在运行时消耗越来越多的内存。我不确定他们是否有一些内存泄漏,或者这是因为内存池中的碎片 - 我感觉后者就是这种情况。
Java库似乎比Qt等类似的强大库需要更多的内存。这是为什么呢?(为了进行比较,启动一些Qt应用程序并查看它们的内存使用情况并启动一些Java应用程序。
为什么它不只使用底层系统技术,如 和 ?或者,如果他们不喜欢 libc 的实现,他们可以使用 jemalloc(如 FreeBSD 和 Firefox),这似乎相当不错。我很确定这会比JVM内存池表现得更好。不仅性能更好,而且需要更少的内存,特别是对于小型应用程序。malloc
free
补充:有人已经尝试过了吗?我对基于LLVM的JavaJIT编译器非常感兴趣,它只使用/用于内存处理。malloc
free
或者,这也可能因JVM实现而异?我主要使用Sun JVM。
(另请注意:我在这里不是直接谈论GC。GC 仅负责计算可以删除的对象并初始化内存释放,但实际释放是不同的子系统。Afaik,它是一些自己的内存池实现,而不仅仅是对.)free
编辑:一个非常相关的问题:为什么(太阳)JVM有固定的内存使用上限?或者换个说法:为什么 JVM 处理内存分配的方式与本机应用程序不同?