String.intern测试

  1. 云栖社区>
  2. 博客列表>
  3. 正文

String.intern测试

好多账号 2018-03-29 14:42:39 浏览21184 评论0

摘要: 场景 从文件中读取 100w行一样的字符串,加到list,评测时间和内存和gc。 场景一,普通模式 List<TestBean> datas = Lists.newArrayList(); Runtime runtime = Runtime.

场景

从文件中读取 100w行一样的字符串,加到list,评测时间和内存和gc。

场景一,普通模式

    List<TestBean> datas = Lists.newArrayList();
    Runtime runtime = Runtime.getRuntime();
    long memoryBefore = runtime.freeMemory();
    Stopwatch stopwatch = Stopwatch.createStarted();
    try (FileReader fileReader = new FileReader("data.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);) {
        String line = null;
        while ((line = bufferedReader.readLine())!=null) {
            TestBean testBean = new TestBean();
            testBean.name = line;
            datas.add(testBean);
        }
    }
    System.out.println("t:"+stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
    System.out.println("m:"+(memoryBefore - runtime.freeMemory()));
    System.out.println(datas.size());

场景二,String.intern

testBean.name = line.intern();

场景三,Guava的Interner

//声明一静态变量
static Interner<Object> objectInterner = Interners.newWeakInterner();
//修改
testBean.name = (String) objectInterner.intern(line);

测试结果

场景 参数 时间 内存 gc
场景一 -Xmx128m 224 65346296 2次minor gc
-Xmx32m oom
场景二 -Xmx128m 334 29105000 2次minor gc
-Xmx32m 1563 19714208 12次minor gc
场景三 -Xmx128m 222 29511112 2次minior gc
-Xmx32m 1751 24794176 12次minor gc

结论

  1. 在内存足够的情况下,可以是用guava Interner,或者String.intern,或者不用,三者区别不大
  2. 在内存有限的情况下,可以考虑 guava Interner,或者String.intern
  3. String.intern只能用在String对象,而guava Interner可以任何非空的object
  4. guava Interner的对象可以是弱引用或是强引用放在内存中,而String.intern存放在常量表中(7以后也放在堆中)

用云栖社区APP,舒服~

【云栖快讯】云栖社区技术交流群汇总,阿里巴巴技术专家及云栖社区专家等你加入互动,老铁,了解一下?  详情请点击

网友评论

好多账号
文章1篇 | 关注0
关注
移动测试(Mobile Testing)是为广大企业客户和移动开发者提供真机测试服务的云平台... 查看详情
全球领先的SaaS性能测试平台,具有强大的分布式压测能力,可模拟海量用户真实的业务场景,让应... 查看详情
业内领先的面向企业的一站式研发提效平台(研发效能),通过项目流程管理和专项自动化提效工具,能... 查看详情
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
建站4折

建站4折