Eclipse的字符串分区共享优化机制

在 Java/C# 这样基于引用语义处理字符串的语言中,作为不可变对象存在的字符串,如果内容相同,则可以通过某种机制实现重用。因为对这类语言来说,指向内存中两块内存位置不同内容相同的字符串,与同时指向一个字符串并没有任何区别。特别是对大量使用字符串的 XML 文件解析类似场合,这样的优化能够很大程度上降低程序的内存占用,如 SAX 解析引擎标准中就专门定义了一个 http://xml.org/sax/features/string-interning 特性用于字符串重用。

在语言层面,Java/C# 中都直接提供了 String.Intern 的支持。而对 Java 来说,实现上的非常类似。由 String.intern 方法,将当前字符串以内容为键,对象引用为值,放入一个全局性的哈希表中。

代码:

//
// java/lang/String.java
//
public final class String
{
  //...
  public native String intern(); // 使用 JNI 函数实现以保障效率
}
//
// hotspot/src/share/vm/prims/jvm.cpp
//
JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
JVMWrapper("JVM_InternString");
if (str == NULL) return NULL;
  oop string = JNIHandles::resolve_non_null(str); // 将引用解析为内部句柄
  oop result = StringTable::intern(string, CHECK_0); // 进行实际的字符串 intern 操作
  return (jstring) JNIHandles::make_local(env, result); // 获取内部句柄的引用
  JVM_END
  //
  // hotspot/src/share/vm/memory/symbolTable.cpp
  //
  oop StringTable::intern(oop string, TRAPS)
  {
   if (string == NULL) return NULL;
   ResourceMark rm(THREAD); // 保护线程资源区域
   int length;
   Handle h_string (THREAD, string);
   jchar* chars = java_lang_String::as_unicode_string(string, length); // 获取实际字符串内容
   oop result = intern(h_string, chars, length, CHECK_0); // 完成字符串 intern 操作
   return result;
  }
  oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS)
  {
   int hashValue = hash_string(name, len); // 首先根据字符串内容计算哈希值
   stringTableBucket* bucket = bucketFor(hashValue); // 根据哈希值获取目标容器
   oop string = bucket->lookup(name, len); // 然后检测字符串是否已经存在
   // Found
   if (string != NULL) return string;
   // Otherwise, add to symbol to table
   return basic_add(string_or_null, name, len, hashValue, CHECK_0); // 将字符串放入哈希表
  }

时间: 2024-08-23 11:30:24

Eclipse的字符串分区共享优化机制的相关文章

移动App性能测评与优化1.4.3 zygote共享内存机制

1.4.3 zygote共享内存机制 上一小节介绍了应用各部分内存的含义,读者对dumpsys meminfo输出的大部分数据都能够有所理解.但dumpsys meminfo工具还会输出Heap Size/Alloc/Free部分的数值.我们知道这些数值是Dalvik虚拟机统计的内存堆的使用量,但这些数值是如何对应到Pss内存上的?比如Heap Alloc和Heap Pss往往相差不远,那是不是可将其看做基本等同的呢?下面我们试图解释这几项数值之间的关系. 由于虚拟机运行时并不区分某个对象实例是

硬盘分区空间优化助手使用方法

  今天我们将要给大家介绍的是硬盘分区空间优化助手的使用方法,从软件的名字来看,这款软件主要是用于硬盘分区管理.那么,对硬盘分区知识比较不了解的网友,可能会问:硬盘分区空间优化助手怎么使用呢?来看看今天小编给您准备的硬盘分区空间优化助手这款软件的使用方法图解,希望大家喜欢! 硬盘分区空间优化助手使用方法: 先来看看有多少空间吧C盘; 下载并打开软件,就能看到这样空白的模样; 点击"打开",浏览到软件目录下自带的"1.扫描应用程序目录.apj"项目,并打开,可看到如下

eclipse使用maven时共享Nexus仓库index缓存的解决办法

不完全解决,但相对有效. 背景 如果你的eclipse管理maven依赖时无法搜索出结果? 如我现有一个常用的项目工作空间目录为: /Users/pollyduan/Documents/workspace 工作目录中的仓库index缓存保存在哪里呢? ${basedir}/.metadata/.plugin/org.eclipse.m2e.core/ 在使用一段时间以后,该目录会膨胀的很严重,比如我现在该目录的大小是1.8G. 如果我再创建一个工作空间,如:/Users/pollyduan/Do

Oracle8i基于规则的优化机制对表达式的处理

oracle|优化      ORACLE优化器在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是:·         要么结果表达式能够比源表达式具有更快的速度 ·         要么源表达式只是结果表达式的一个等价语义结构 不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构. 下面将讨论优化器如何评估优化如下的情况和表达式:常量 LIKE 操作

Apache Geode/GemFire 数据分区和路由机制浅析

本篇文章主要讲解Apache Geode/GemFire 是如何进行数据分区的. GemFire和大多数分布式系统一样都采用 Hash 的方式对数据进行分区,将 Entry 数据分布到 PartitionedRegion 当中,大家都知道 Entry 数据主要保存在 ConcurrentHashMap 中,ConcurrentHashMap存放在 Bucket 中,在 PR 服务器启动后会为 PartitionedRegion创建相应的Bucket 来保存这个ConcurrentHashMap.

Java字符串之性能优化

转自:http://it.deepinmind.com/categories.html 基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值转化成String(不然的话像System.out.println(1+'a')会输出98,而不是"1a").当然了,有一组String.valueOf方法可以完成这个(或者是基础类型对应的包装类的方法

JavaScript 字符串连接性能优化_javascript技巧

复制代码 代码如下: var str = "hello"; str += " world"; 后台所做工作: 1)创建存储 "hello" 的字符串,且使 str 指向它. 2)创建存储 "world" 的字符串. 3)创建存储结果的字符串. 4)将 str 中的当前内容复制到结果字符串中. 5)把 world 复制到结果字符串中. 6)更新 str ,使 str 指向结果字符串. 每拼接一次字符串就循环重复2)~6),如果重

判断字符串的长度(优化版)中文占两个字符_javascript技巧

刚看到以前写的js方法:计算字符串长度(中文算2个字符). 方法: var str = '123是是是'; var strArr = str.split(''); var count = 0; for(strArr.length){ **** } ------(不上代码了,累!!) 修改后: 复制代码 代码如下: var str = '123是是是'; var tmpStr = str.replace(/[\u4e00-\u9fa5]/gi,"aa"); //print tmpStr.

SQL优化思路及结果集重用优化和分区索引优化测试

1.自己构造两条不同的SQL来完成相同的查询,注意结果集重用对SQL性能的影响 四个主人公:alan  leonarding  sun   xy 故事:这4个小伙伴刚刚毕业,毕业后都顺利的找到了工作,现在已经工作半年了,一次他们聚在了一起,由于虚荣心的驱动他们想比一比谁的工资攒的多,大家都是学IT出身,于是他们做了一个leo_salary表来计算他们这半年来的平均工资! 创建了leo_salary表,雇员id  名/字  薪水  月份 LS@LEO> create table leo_salar