【发布时间】:2021-02-07 07:03:52
【问题描述】:
我正在调查在 Java 8 JVM 上运行的 Grails 3.3.10 服务器中的内存泄漏。我从内存不足的生产服务器中提取了一个堆转储,并使用JXRay 对其进行了分析。 html 报告说,一些内存浪费在重复的字符串上,开销为 19.6%。其中大部分浪费在空字符串“”的重复上,并且主要来自数据库读取。我对此有两个问题。
-
我应该开始实习字符串还是操作成本太高不值得?
-
我的很多代码都处理来自 elasticsearch 的深度嵌套的 JSON 结构,我不喜欢代码的脆弱性,所以我创建了一个小的帮助程序类以避免在访问来自 json 的数据时出现拼写错误。
public static final class S {
public static final String author = "author";
public static final String aspectRatio = "aspectRatio";
public static final String userId = "userId";
... etc etc
这有助于我避免这样的错别字:
Integer userId = json.get("userid"); // Notice the lower case i. This returns null and fails silently
Integer userId = json.get(S.userId); // If I make a typo here the compiler will tell me.
我对此感到相当高兴,但现在我在猜测自己。出于某种原因,这是一个坏主意吗?我还没有看到其他人这样做。这不应该导致创建任何重复的字符串,因为它们被创建一次,然后在我的解析代码中被引用,对吧?
【问题讨论】:
-
如果你的目标是减少内存消耗,那么是的,也许你应该检查你的字符串,比如
if (str.length == 0) str = ""; //this will use the intern version
标签: java string memory-leaks