【发布时间】:2014-12-05 01:40:27
【问题描述】:
我正在使用 VisualVM 监控大型 java 应用程序的性能和 CPU。 当我查看它的内存配置文件时,我发现最大堆(大约 50%)正在被 char 数组用完。
以下是内存配置文件的截图:
在任何给定时间的内存配置文件中,我看到大约 9000 个 char[] 对象。
应用程序接受一个大文件作为输入。该文件大约有 80 行,每行包含 15-20 个分隔的配置选项。应用程序解析文件并将这些行存储在字符串的 ArrayList 中。然后它解析这些字符串以获取每个服务器的单独配置选项。
应用程序还经常将每个事件记录到控制台。
字符串的 Java 实现在内部使用 char[] 以及对数组和 3 个整数的引用。
从互联网上的不同帖子看来,StringBuffer、StringBuilder、String.intern() 是更节省内存的数据类型。
它们与 java.lang.String 相比如何?有人对它们进行基准测试吗?如果应用程序使用多线程(它确实如此)它们是安全的选择吗?
【问题讨论】:
-
你实际使用字符串是为了什么?这些都不会“自动”更有效。我们需要更多细节。
-
@JarrodRoberson 你读过这个问题吗?它的标题是优化堆使用。链接问题中没有堆,当谈到内存时,它们意味着 GC 开销。 这个问题可能与其他问题重复,肯定是一个混淆问题,但与链接问题大多无关。您以粗体引用的部分只是问题的一小部分。
-
Strings是Strings在 Java 中是Strings。它们如何成为字符串的实例相对不重要,因为当您释放StringBuffer/StringBuilder时,它就有资格被收集。垃圾收集取决于两件事,它们是否可访问以及内存压力是多少? The rest is pretty much completely out of your control. -
如果你想优化堆的使用,确保你的
List中的Strings从List中删除,并且所有的引用在你完成它们后立即被释放。对此没有深入的分析,即 Java 101。除非你得到OutOfMemoryExceptions,否则这里没有问题。看看Related侧边栏,Stackoverflow 上已经讨论过这个问题。 -
你为什么要将文件读入 ArrayList 呢?不能逐行处理吗?
标签: java string optimization heap-memory visualvm