【问题标题】:Will the string obtained from http request be saved in the constant pool?http请求得到的字符串会保存在常量池中吗?
【发布时间】:2013-02-24 22:36:33
【问题描述】:

我知道声明如下的String会保存在常量池中:

例如。

String a = "test'; 

然后测试将保存在池中

我想知道字符串是从方法获取的,例如从网络表单发布的请求参数,还是从文件中读取。 例如。

String name = request.getRequestParameter("name");

name中的值会保存在常量池中吗?我猜不是?因为否则你很快就会出现内存不足 perm gen 错误?

谁能赐教?

谢谢

【问题讨论】:

  • 只有字符串字面量在常量池中。其他任何事情都需要显式调用intern 才能到达那里。
  • 所以“name”中的值不会保存在常量池中,很快就会被垃圾回收?谢谢

标签: java string permgen


【解决方案1】:

没有。 interned 何时以及如何使用字符串在 String#intern documentation 和 JLS Section 3.10.5 中进行了描述。基本上,文字和(其他)字符串常量是自动实习的,但除非你明确地这样做,否则没有其他可能。

顺便说一句,您似乎假设实习字符串永远不会被垃圾收集。我在 Java 文档中没有看到任何实际的内容,并且at least one person 声称他的测试表明它们实际上是经过 GC 处理的,这表明实习池使用了某种形式的弱引用。

【讨论】:

  • 也许以“否”行开头。毕竟这是基本答案。
  • 谢谢,是的,我假设实习字符串永远不会被垃圾回收,但我自己做了一些测试,结果它并没有给我 permgen out of memory 错误。
  • @grumpynerd:很高兴有帮助!
  • +1 我测试了该博客中的代码,可以确认结果。
  • 感谢 TJ,这意味着我们永远不需要担心 String 的内存问题,例如,如果有人从 web 表单中发布了一个巨大的字符串并且应用程序在本地方法中处理它,那么它将得到垃圾最终收集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2012-12-18
  • 2019-07-26
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多