今天写了一段代码,大致如下文所示,
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.match(content);//注意这里的content变量
while (matcher.find()) {
String outlink = matcher.group(1);
set.add(outlink);//其中set 是HashSet的类型
}
这段代码,很好理解,就是我们使用正则去匹配, 得到内容,将匹配的东东放到一个Hashset中。
然后尝试运行, 运行一个小时左右,通过Jconsole发现内存消耗很快,使用mat工具将堆内存分析之后,得出就是这个set占用了太多的内存, 对set对象中的string分析,发现了一个问题,
如果一个string 输出是aaaa, 但是这个string的对象里面的value字段并不是4个a的char[], 而是和content的value字段相同,这就是说,outlink里面的value字段是和content里面的value字段是相同长度的char[], 相当于复制了一遍?,只不过outlink变量的offset和count决定了最后outlink是aaaa,而不是content的输出。
不知道,童鞋门到这里看到了什么问题,是的,set表面上是存了一个outlink的内存,实际上set存了一个content的内存,如果content的长度远远大于outlink的话,就出现了上诉的情况。
晚上查查资料,发现在linux环境下7.0.17版本的String不会出现问题,查看源码, 发现这个版本的String remove掉了count和offset字段,为什么remove掉呢, 肯定不是因为我的原因,官方解释link:
http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-May/010257.html
好了,事情到了这一步,应该是万事大吉了,
如果是以前版本的话,我这么写了以下,虽然看上去怪怪的,但是总比内存泄露好阿!
String link = new String(matcher.group(1).getByte());
分享到:
相关推荐
### Java的String类详解 #### 引言 在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境...
Java中的`String`类是Java语言中最常用的数据类型之一,用于表示不可变的字符序列。在Java中,字符串被视为对象,它们的实例是由`String`类创建的。下面我们将详细探讨`String`类的一些关键构造方法和方法。 1. **...
`String`类提供了多种构造方法,如`String()`用于创建空字符串,`String(char[] value)`通过字符数组初始化,`String(String original)`用于复制已有字符串,以及`String(char[] value, int offset, int count)`用于...
### JAVA String 类函数总结 #### 一、字符串创建与初始化 在 Java 中,`String` 类是最常用的字符串处理工具之一。它可以用来表示一系列字符,并且提供了丰富的方法来操作这些字符。下面通过示例代码展示了如何...
### Java常用类与基础API-String的构造器与常用方法 #### 一、String的常用API-1 ##### (1)构造器 1. **介绍** - `public String()`: - 初始化新创建的 `String` 对象,以使其表示空字符序列。即创建了一个...
3. 使用 String 的构造方法:例如,String s = new String(byte[] bytes, int offset, int length); 三、String 对象的比较 Java 中有两种方式可以比较 String 对象: 1. 使用 "==" 操作符:例如,s1 == s2; 2. ...
### Java中的String、StringBuffer和Math类 #### String类详解 **String类**在Java中扮演着极其重要的角色,主要用于处理不可变的字符序列。它不仅功能强大而且使用广泛,几乎所有的Java应用程序都会涉及到字符串...
- 部分转换:使用构造函数`String(char[] value, int offset, int count)`,如`new String(charArray, start, length)`,从`offset`开始,截取`length`个字符。 例如: ```java String str1 = "hello word"; char...
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
7. `static String copyValueOf(char[] data, int offset, int count)`:类似于上述方法,但只包含数组从`offset`开始的`count`个字符。 8. `boolean endsWith(String suffix)`:检查字符串是否以指定的后缀结尾。 ...
Java中的`String`类是处理文本数据的核心工具,它提供了丰富的功能来操作和管理字符串。字符串在Java中是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。以下是对`String`类中一些常用方法的...
- `String(char[] value, int offset, int count)`:从字符数组的一部分创建字符串。 2. **获取字符串信息**: - `length()`:返回字符串的长度,即字符个数。 - `charAt(int index)`:返回指定索引处的字符。 ...
Java中的String类是编程中最常用的类之一,它用于表示不可变的字符序列。在Java中,字符串被视为对象,因此我们可以通过调用String类的各种方法来处理字符串。以下是一些常用的String类方法的详细说明: 1. 构造...
### Java中的Char与String函数详解 #### 一、概述 在Java编程语言中,`char`类型用于表示单个字符,而`String`类则用于处理字符串数据。这两种类型是进行文本处理时不可或缺的基础工具。本文将详细介绍Java中与`...
`String(char[] value, int offset, int count)`构造函数:** 使用字符数组的一部分创建字符串。例如: ```java char[] a = {'s', 't', 'u', 'd', 'y'}; String str = new String(a, 1, 3); // 结果为 "tud" ...
易语言JAVA对象模块源码,JAVA对象模块,NewString,NewString_bytes,NewString_bytes_charset,NewString_bytes_offset_length,NewString_bytes_offset_length_charset,NewString_bytes_offset_length_charsetName,New...
3. `String(char[] value, int offset, int count)`:从字符数组的指定偏移量 `offset` 开始,取 `count` 个字符创建新的 `String` 对象。 在示例代码中,我们看到: ```java String s1 = "hello"; String s2 = ...
在Java编程语言中,String对象的不可变性是一个核心概念,也是面试中常见的问题。通常我们认为,一旦创建了一个String对象,其内容就不能更改。然而,通过深入源码,我们可以揭示String的可变性背后的机制。 首先,...