为什么Java有这么大的足迹?

Yan*_*ang 15 java memory footprint

Java - 或者至少是Sun的Hotspot JVM - 长期以来因拥有非常大的内存占用而闻名.究竟是什么使JVM获得了这种声誉呢?我对详细的细分感兴趣:运行时(JIT?GC /内存管理?类加载器?)有多少内存与JNI/JVMTI等"辅助"API有关?标准库?(哪些部分得到多少?)任何其他主要组件?

我意识到如果没有具体的应用程序和VM配置,这可能不是直截了当的,所以只是为了至少在某种程度上缩小范围:我主要对默认/典型VM配置和基线控制台"Hello world"应用程序感兴趣以及任何真实的桌面或服务器应用程序.(我怀疑JVM的大部分内容在很大程度上独立于应用程序本身,而且在这部分我想要放大,理想情况下.)

我还有其他一些密切相关的问题:

  • 其他类似的技术,例如.NET/mono,并没有表现出几乎相同的足迹.为什么会这样?

  • 我已经在intarwebs的某个地方读到,很大一部分足迹只是由于标准库的大小.如果是这种情况,那么为什么要预先加载这么多标准库呢?

  • 是否有任何努力(JSR,无论如何)来驯服内存占用?我遇到的最接近的事情是减少JVM的磁盘占用空间的项目.

  • 我确信在过去的十年左右,每个新版本的Java都会有足够的空间.是否有任何特定的数字/图表精确记录了JVM的足迹变化多少?

Rob*_*anu 7

一些举措:

  • 由于可以使用1.5 类数据共享 ;
  • Java 6更新14引入了压缩oops,减少了低于4GB Heap的64位JVM的占用空间.


oxb*_*kes 5

我们有一些服务器端应用程序除了桥接多播流量之外什么都不做(即它们没有永久状态).它们都在32位Java6(linux)JRE上以大约2.3-2.5 Mb的堆运行.

这是一个很大的足迹吗?在一个典型的服务器级机器上(从内存的角度来看),我可以很容易地拥有上千个这样的机器,尽管从线程角度来看这有点毫无意义!

也就是说,有一个Jigsaw项目可以模块化Java(我相信的库),它们将在Java7中出现; 这将有助于那些希望缩小脚印的人.

我意识到这并没有真正回答你的问题,但它仍然是相关的!您在设计哪种应用程序时会发现内存占用问题?

  • 这与Java*的*足迹无关,也与NetBeans应用程序有关!我的IntelliJ IDEA经常使用700多Mb的堆 - 这是因为我打开了多个项目并且它已将内存中的*所有*编入索引以提高速度 (3认同)
  • 这种IDE的Imho 230 MB很小.无论如何,内存现在很便宜. (3认同)
  • 我打开Chrome有12个标签,它使用> 250Mb.我确信这与我正在访问的网站(pfffft)有很大关系:Java应用也是如此.如果他们在内部缓存大量数据,那么它们就更大了.这与VM占用空间无关 (3认同)
  • 好吧,我现在有一个Java应用程序(NetBeans)正在运行,而java.exe目前使用230 MB内存.我不会称之为小占地面积. (2认同)