`
暗夜骑士0376
  • 浏览: 79906 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

关于Java String 的 offset 问题。

阅读更多
今天写了一段代码,大致如下文所示,

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对象模块源码,JAVA对象模块,NewString,NewString_bytes,NewString_bytes_charset,NewString_bytes_offset_length,NewString_bytes_offset_length_charset,NewString_bytes_offset_length_charsetName,New...

    java 时区转换工具包

    2. 解析指定时间 public static ZonedDateTime parse(String date,String dateFormat,int offset) 3. 获取某一天的零点 public static ZonedDateTime getTodayZonedDayBegin(int offset) 4. 指定某一天的零点 public...

    Java精华(免费版)

    String(byte[] byte,int offset,int length);这个在上面已经用到。 2、equalsIgnoreCase:忽略大小写的比较,上例中如果您输入的是BYE,则不会退出,因为大小写不同,但是如果使用这个方法,则会退出。 3、indexOf(int...

    java时间处理工具类--DateUtils

    /** * @(#)DateUtil.java * ... public static Date strToDate(String dateStr, String format) { Date date = null; if (dateStr != null && (!dateStr.equals(""))) { DateFormat df ...

    java编写的弹球小游戏

    public Ball(int panelWidth, int panelHeight, int offset, String path) throws IOException { // 调用父构造器 super(panelWidth, panelHeight, path); // 设置y坐标 this.setY(panelHeight - super....

    阳历转阴历_java

    final static String chineseNumber[] = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" }; static SimpleDateFormat chineseDateFormat = new SimpleDateFormat( "yyyy年...

    JAVA精华.rar

    String(byte[] byte,int offset,int length);这个在上面已经用到。 2、 equalsIgnoreCase:忽略大小写的比较,上例中如果您输入的是BYE,则不会退出,因为大小写不同,但是如果使用这个方法,则会退出。 3、 indexOf...

    java微信公众号MVC开发框架

    jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...

    java编写智能合约-简单的用java代码实现智能合约.pdf

    java编写智能合约_简单的⽤java代码实现智能合约 简单的⽤java代码实现智能合约 简单理解智能合约: 所谓智能合约,从另⼀个⾓度望过去,就是写⼊了不可篡改的电⼦账簿中的,可执⾏但不可篡改的程序代码⽽已。...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    Android代码-android-manifest-parser

    AndroidManifest解析器 一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。 AndroidManifest.xml文件格式 ... String Pool Offset 4bytes // 字符串常量池相对于Chunk偏移值 Sty

    Java中常用字符串方法总结

    一、创建并初始化字符串:  1、使用字符串常量直接初始化 ...  String(char[] value,int offset,int count);//截取字符数组offset到count的字符创建一个非空串  String(StringBuffer buffer);//利用StringBuffer

    google search client api for c/c++

    Google 网站上提供了goole search client api for Java和for dot.net的版本,大家可以参考. For C/C++的版本特点如下 内置XML解析器. 内置gbk/utf-8编码/解码器(包含GBK编码表) 采用Pure C编写,采用标准C接口. ...

    zxing.java源码解析-Specialsymbols:一些字符集编码资料收集

    String name = “@”; int codePoint = Character.codePointAt(name, offset); codePoint 等于 64 该篇对字符集编码及java开发web开发应用解析较全面 正则表达式 原码, 反码, 补码 jQuery 设计模式 算法 ZBar 条码 ...

    java-api-base:Java API库

    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

    F1Engine V0.1 alpha版本是我用晚上的业余时间写的一个java文件操作组件,目前只是在原型的测试阶段。 主要的设计目标是:简单方便 可以方便地加到应用中,可以满足日常应用中的大部分应用场景。 二、使用...

    非常好的kafka项目资源,分享出来.zip

    kafka-map是使用Java17和React开发的一款kafka可视化工具。 目前支持的功能有: 多集群管理 集群状态监控(分区数量、副本数量、存储大小、offset) 主题创建、删除、扩容(删除需配置delete.topic.enable = true...

    ip地址库 很全的库

    * 注意,这个文件里的ip地址和所有的偏移量均采用little-endian格式,而java是采用 big-endian格式的,要注意转换 */ public class IPSeeker { /** * 用来封装ip相关信息,目前只有两个字段,ip所在的...

    一个美观简洁且强大的kafka web管理工具

    kafka-map是使用Java17和React开发的一款kafka可视化工具。 目前支持的功能有: 多集群管理 集群状态监控(分区数量、副本数量、存储大小、offset) 主题创建、删除、扩容(删除需配置delete.topic.enable = true...

Global site tag (gtag.js) - Google Analytics