【问题标题】:Is the memory allocated to all the strings in the switch block?内存是否分配给 switch 块中的所有字符串?
【发布时间】:2012-06-08 13:16:43
【问题描述】:
case k_A:
  jstring a  = "....";
  break;
case k_B:
  jstring b = "....";
  break;
case k_C:
  jstring c = ".....";
  break;
case k_D:
  jstring d = ".....";
  break;
default:
  jstring dflt = ".....";

在我的 case 中实际上有 200 个 case 语句。虽然一次只有一个 case 语句起作用,但内存是否分配给了 switch 块中的所有 201 语句?如果是,是否推荐这种方法?

【问题讨论】:

  • @Oli Charlesworth 我的意思是编译器会为每个人分配一块内存吗?
  • 您的实际代码是什么?您真的将 C 字符串常量分配给 jstring 吗?还是"....." 是对NewStringUTF 的调用?
  • @Edward Thomson 调用 newstringutf,bohemian 的答案在 jni 下会有所不同?

标签: java memory-management java-native-interface switch-statement


【解决方案1】:

字符串文字都是静态存在的。你认为它们是从哪里神奇地出现的?在这种情况下,它是 C,所以它们都存在于您的数据段中。

如果你的 case 值是相邻的,你应该使用查找数组而不是 switch 语句

但是您的代码还有其他问题。 C 文字不是 jstrings。您需要调用 NewStringUTF()。

【讨论】:

  • 这个答案对于 java 有什么不同
【解决方案2】:

每次 JVM 启动时,一次 为所有字符串文字分配内存。

原因在于String interning:字符串字面量作为特殊常量被有效地编译到字节码中,并且在类加载时为所有它们分配内存,并且再也不会。

虽然代码似乎在每次调用该方法时都分配内存,但实际上并非如此 - JVM 会回收这些 String 对象,这样做是安全的,因为 String 是 immutable

这就是这段代码有效的原因:

String a = "foo";
String b = "foo";
boolean same = (a == b); // true - they are the SAME object!

不用担心内存使用 - 保持代码不变。

【讨论】:

  • 所以我必须一个一个地删除每个引用
  • @assylias 谢谢 - 字符串 literals。答案如此编辑。
  • @program-o-steve 你不能删除引用。它由 String 类在内部处理。就别管了。 200 个字符串字面量什么都不是,除非你正在编写代码以在非常非常小的环境中运行
  • 我怀疑任意 c 模块中的字符串文字是否被实习过。这究竟是如何工作的?文字本身是由编译器在数据段中分配的,因此您也不必(不需要!)为它们付费。
  • @Bohemian:看着编辑,我意识到这个问题在发布时没有 jni 标签 - 但这确实看起来是 C 中的 JNI。
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多