【发布时间】:2020-03-24 14:22:00
【问题描述】:
我在一个类中有一个方法,我在其中创建了这样的字符串:
private void log(HttpServletRequest request, HttpServletResponse response) {
String result = "Following request " + request.getRequestURI() + " yielded " + response.getStatus();
log.info(result);
}
我的问题是,result 字符串被生成了数百万次。对堆内存有影响吗?
我目前的理解是每个方法都有自己的堆内存分配。方法执行完毕后,所有局部变量都会从内存中消失。
我的另一个理解是字符串存储在全局堆内存中,它们会在下一个垃圾回收周期被清理。
有人能说明一下吗,我将不胜感激。
【问题讨论】:
-
Java 可以随意使用内存,永远不要依赖它。 Java 将最终清理未使用的实例,包括仅在方法中知道的本地字符串。请注意,尽管您将其传递给
log(但我想在记录后很快就会释放字符串)。 -
无论如何,您在这里也无能为力(如果您想保留日志,那就是)。 Java 已经将
+调用转换为StringBuilder用法(自Java 9 起甚至更好),所以这部分已经很好了。而且您无法在编译时计算字符串,因为 URI 和响应状态每次都会更改。唯一可以优化的就是去掉临时变量result。相反,直接在log.info(...)调用中创建字符串。但仅此而已。 -
JIT 编译器应该已经为您优化掉了局部变量,所以即使这样也没有必要。
标签: java