今天写了一段代码,大致如下文所示,
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对象模块源码,JAVA对象模块,NewString,NewString_bytes,NewString_bytes_charset,NewString_bytes_offset_length,NewString_bytes_offset_length_charset,NewString_bytes_offset_length_charsetName,New...
2. 解析指定时间 public static ZonedDateTime parse(String date,String dateFormat,int offset) 3. 获取某一天的零点 public static ZonedDateTime getTodayZonedDayBegin(int offset) 4. 指定某一天的零点 public...
String(byte[] byte,int offset,int length);这个在上面已经用到。 2、equalsIgnoreCase:忽略大小写的比较,上例中如果您输入的是BYE,则不会退出,因为大小写不同,但是如果使用这个方法,则会退出。 3、indexOf(int...
/** * @(#)DateUtil.java * ... public static Date strToDate(String dateStr, String format) { Date date = null; if (dateStr != null && (!dateStr.equals(""))) { DateFormat df ...
public Ball(int panelWidth, int panelHeight, int offset, String path) throws IOException { // 调用父构造器 super(panelWidth, panelHeight, path); // 设置y坐标 this.setY(panelHeight - super....
final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" }; static SimpleDateFormat chineseDateFormat = new SimpleDateFormat( "yyyy年...
String(byte[] byte,int offset,int length);这个在上面已经用到。 2、 equalsIgnoreCase:忽略大小写的比较,上例中如果您输入的是BYE,则不会退出,因为大小写不同,但是如果使用这个方法,则会退出。 3、 indexOf...
jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...
java编写智能合约_简单的⽤java代码实现智能合约 简单的⽤java代码实现智能合约 简单理解智能合约: 所谓智能合约,从另⼀个⾓度望过去,就是写⼊了不可篡改的电⼦账簿中的,可执⾏但不可篡改的程序代码⽽已。...
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
AndroidManifest解析器 一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。 AndroidManifest.xml文件格式 ... String Pool Offset 4bytes // 字符串常量池相对于Chunk偏移值 Sty
一、创建并初始化字符串: 1、使用字符串常量直接初始化 ... String(char[] value,int offset,int count);//截取字符数组offset到count的字符创建一个非空串 String(StringBuffer buffer);//利用StringBuffer
Google 网站上提供了goole search client api for Java和for dot.net的版本,大家可以参考. For C/C++的版本特点如下 内置XML解析器. 内置gbk/utf-8编码/解码器(包含GBK编码表) 采用Pure C编写,采用标准C接口. ...
String name = “@”; int codePoint = Character.codePointAt(name, offset); codePoint 等于 64 该篇对字符集编码及java开发web开发应用解析较全面 正则表达式 原码, 反码, 补码 jQuery 设计模式 算法 ZBar 条码 ...
add pagination helper: val (offset, length) = Pagination.config(page) or Pagination.config(page, 20) 生成uid方法 String uid = uidService.get(new UIDRunner() { @Override public String generate() { ...
F1Engine V0.1 alpha版本是我用晚上的业余时间写的一个java文件操作组件,目前只是在原型的测试阶段。 主要的设计目标是:简单方便 可以方便地加到应用中,可以满足日常应用中的大部分应用场景。 二、使用...
kafka-map是使用Java17和React开发的一款kafka可视化工具。 目前支持的功能有: 多集群管理 集群状态监控(分区数量、副本数量、存储大小、offset) 主题创建、删除、扩容(删除需配置delete.topic.enable = true...
* 注意,这个文件里的ip地址和所有的偏移量均采用little-endian格式,而java是采用 big-endian格式的,要注意转换 */ public class IPSeeker { /** * 用来封装ip相关信息,目前只有两个字段,ip所在的...
kafka-map是使用Java17和React开发的一款kafka可视化工具。 目前支持的功能有: 多集群管理 集群状态监控(分区数量、副本数量、存储大小、offset) 主题创建、删除、扩容(删除需配置delete.topic.enable = true...