自JDK 6以来,Java内存使用率有提高吗?

自JDK 6以来,Java内存使用率有提高吗?,java,memory,Java,Memory,我的组织目前正在进行系统升级,升级多个版本。我们当前的版本在Java 6上运行,而升级的版本将在Java 8上运行。我们收到了新的硬件大小调整文档,这些文档实际上需要的内存比当前使用的内存要少得多,从28GB降至16GB。当我们联系供应商表示我们的担忧时,他们表示应用程序以及Java管理内存的方式都有了改进 我愿意相信在应用程序效率方面已经有了一些改进,但这似乎是一个巨大的变化。Java内存管理从v6到v8真的有了显著的改进吗?在Java 6中,字符串使用了带有偏移量和计数的共享字符[],这样子

我的组织目前正在进行系统升级,升级多个版本。我们当前的版本在Java 6上运行,而升级的版本将在Java 8上运行。我们收到了新的硬件大小调整文档,这些文档实际上需要的内存比当前使用的内存要少得多,从28GB降至16GB。当我们联系供应商表示我们的担忧时,他们表示应用程序以及Java管理内存的方式都有了改进

我愿意相信在应用程序效率方面已经有了一些改进,但这似乎是一个巨大的变化。Java内存管理从v6到v8真的有了显著的改进吗?

在Java 6中,字符串使用了带有偏移量和计数的共享字符[],这样子字符串就不必复制字符[]

这是一个过早的优化,事实表明,许多程序会加载一个大字符串,创建几个子字符串并存储这些子字符串,导致整个大字符串留在内存中

在Java7中,他们消除了共享字符[],提高了许多程序的内存使用。但是,某些程序可能会使用更多内存。这取决于字符串的使用方式。见例

人们仍然发现,字符串对象是大多数程序中最大的内存消耗者,因此已经解决了这一问题:

在Java8U20中,实现了字符串重复数据消除。看

在Java9中,仅由拉丁1字符组成的字符串现在使用每个字符1字节来存储字符串,而不是每个字符2字节。看

这些都是仅针对字符串的优化。可能还有其他内存使用方面的改进,但字符串是这方面的最大贡献者

从v6到v8,Java内存管理真的有了显著的改进吗

Java的各个方面都发生了变化,可能会影响应用程序的内存使用。但它们是否真的会显著影响使用率将取决于应用程序。。。它们包括它的设计和编码方式,以及为您的环境配置/部署的方式

在我看来,你的供应商所说的是似是而非的,但不一定是真的。确定它是否为真的唯一方法是测试一个断言,即更新的应用程序将以较小的内存占用为您工作

另一方面,你不能简单地回击供应商;e、 说StackOverflow不相信你。他们将用具体的证据来反驳。为了得到可信的证据。。。你需要测试一下

但真正的问题是:

如果供应商的断言过于乐观,你会怎么做? 修理它是你的责任,还是他们的责任?合同上怎么说? 你或他们对此有计划吗? 如果计划失败了怎么办? 如果需要的话,您是否可以退回新的硬件大小调整文档?
1-当然,这只是一种观点,其他观点可能会有所不同。这才是真正的问题

你是说随着时间的推移,第三方软件内存需求会减少吗?如果是这样的话,这就不常见了——也许它们的早期版本是为了上市而拼凑起来的,后来它们利用从许可证中筹集的资金改进了它们的实现。顺便说一句,即使您更新到Java8,您也只会落后4年而不是12年。GC已经有所改进。但可能节省的大部分内存来自修复浪费内存的糟糕代码。嘿,这是一个供应商应用程序。我不知道如何才能得到更精确的答案。简言之,JVM的改进并不意味着同一应用程序使用的内存要少得多。是的,您可能会看到堆大小有很大的改进,因为插入的字符串和类元数据存储在本机内存中,而不是永久空间中。TBH,如果他们没有向您指出Java管理内存的具体改进,而这些改进对他们的应用程序有利,那么这很可能是一种偏离他们的应用程序使用了太多内存这一事实的方式,大多数改进都来自于对应用程序的改进。@Bohemian他们确实说过应用程序也经过了优化,所以不,不是仅通过字符串优化实现12GB。我读过一些统计数据,在一些程序中,字符串占用了超过50%的内存。因此,如果我们假设一个LATIN1程序,那么50%的字符串*50%的LATIN1=25%的节省,28Gb=7GB,来自字符串。谢谢,这给了我一个很好的开始,让我知道一些优化可能是什么。