gpt4 book ai didi

java - 大子串的内存使用情况?

转载 作者:行者123 更新时间:2023-11-29 03:09:12 25 4
gpt4 key购买 nike

阅读 String#substring (Java 1.7) 的源代码,它看起来像是重用了字符数组,但具有不同的偏移量和长度。这意味着如果我有一个巨大的 String 子字符串,初始字符串将永远不会被 GC 回收(对吧?)。

确保回收巨大的 String 的最简单方法是什么?我正在运行 JavaSE-1.7。

(出于好奇,我将用 Java 编写基数实现以减少内存使用。这个问题的答案对于避免基数树使用不必要的内存至关重要)

最佳答案

对于 JDK 7u6 之前的版本

在这种情况下,您应该使用 String(String) 构造函数:

163  public String(String original) {
164 int size = original.count;
165 char[] originalValue = original.value;
166 char[] v;
167 if (originalValue.length > size) {
168 // The array representing the String is bigger than the new
169 // String itself. Perhaps this constructor is being called
170 // in order to trim the baggage, so make a copy of the array.
171 int off = original.offset;
172 v = Arrays.copyOfRange(originalValue, off, off+size);
173 } else {
174 // The array representing the String is the same
175 // size as the String, so no point in making a copy.
176 v = originalValue;
177 }
178 this.offset = 0;
179 this.count = size;
180 this.value = v;
181 }

String s = "some really looooong text";
String s2 = new String(s.substring(0,3));

当您将 s.substring() 的结果传递给 String 构造函数时,它不会使用原始 char[] >字符串。所以原来的String是可以GC的。这实际上是应该使用 String 构造函数的用例之一。而在大多数情况下,我们应该使用 String 文字赋值。

JDK 7u6+版本

在 Java 7 中,String.substring() 的实现已经改变,现在内部使用 String(char value[], int offset, int count) 构造函数(我们必须在旧版本中手动使用以避免内存泄漏)。此构造函数检查它是否需要原始 Stringvalue[] 数组或更短的数组就足够了。因此,对于 JDK 7+,使用 String.substring() 不会造成内存泄漏问题。请查看源代码 String.substring()

关于java - 大子串的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30371113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com