Dalvik VM Hash - how to use

原创 2012年03月30日 00:26:03

Dalvik 虚拟机 之 哈希表使用篇

前面介绍了dvm里德哈希表提供的方法。下面就以InternedString实现为例介绍一下哈希表的使用。我们将看到dvm里哈希表的设计非常直观,其使用更是简单明了。

 

Interned String是指java虚拟机将某些字符串“内部化”,和不同字符串的最大区别就是在虚拟机内部永远只会存在改字符串的唯一实例。多次分配改string都将返回该字符串唯一的实例。也就是说 对于Interned string a 和b,我们可以使用比较运算符(==)来判断他们是否相同。而普通的字符串必须使用equal函数。

Java Interned String分为两类,一类是literal string。就是字符常量。比如通过以下语句得到的字符串:

String literal = "I am a literal string";

另一类是用户调用 java.lang.String.intern() 得到的。 与字符常量不同,该类字符串只能是弱引用的(weakly referenced)。

 

DVM interned string 实现 在 dalvik/vm/Intern.h dalvik/vm/Intern.cpp 里。 下面将看看它是如何使用hash来实现的。

/*

* Prep string interning.

*/

bool dvmStringInternStartup()

{

dvmInitMutex(&gDvm.internLock);

gDvm.internedStrings = dvmHashTableCreate(256, NULL);

if (gDvm.internedStrings == NULL)

return false;

gDvm.literalStrings = dvmHashTableCreate(256, NULL);

if (gDvm.literalStrings == NULL)

return false;

return true;

}

首先是在启动函数里,调用dvmHashTableCreate来创建两个哈希表,一个存放 interned string,一个存放literal string。初始的表大小为256。单元释放函数为NULLL。

 

/*

* Chuck the intern list.

*

* The contents of the list are StringObjects that live on the GC heap.

*/

void dvmStringInternShutdown()

{

if (gDvm.internedStrings != NULL || gDvm.literalStrings != NULL) {

dvmDestroyMutex(&gDvm.internLock);

}

dvmHashTableFree(gDvm.internedStrings);

gDvm.internedStrings = NULL;

dvmHashTableFree(gDvm.literalStrings);

gDvm.literalStrings = NULL;

}

这是相反的过程,调用dvmHashTableFree清理掉所有哈希表单元,然后释放掉哈希表本省。

static StringObject* lookupString(HashTable* table, u4 key, StringObject* value)

{

void* entry = dvmHashTableLookup(table, key, (void*)value,

dvmHashcmpStrings, false);

return (StringObject*)entry;

}

搜索字符串更简单,只需要调用哈希表搜索函数dvmHashTableLookup。传入的哈希表可能是前面提到的 gDvm.internedStrings或者gDvm.literalStrings。最后一个参数isAdd为false,标识这是纯粹的查找,而不需要在查找未果的情况下插入。

static StringObject* insertString(HashTable* table, u4 key, StringObject* value)

{

if (dvmIsNonMovingObject(value) == false) {

value = (StringObject*)dvmCloneObject(value, ALLOC_NON_MOVING);

}

void* entry = dvmHashTableLookup(table, key, (void*)value,

dvmHashcmpStrings, true);

return (StringObject*)entry;

}

 

插入字符串也是简单的调用函数dvmHashTableLookup并且传入isAdd为true(最后一个参数)。

/*

* Clear white references from the intern table.

*/

void dvmGcDetachDeadInternedStrings(int (*isUnmarkedObject)(void *))

{

/* It's possible for a GC to happen before dvmStringInternStartup()

* is called.

*/

if (gDvm.internedStrings != NULL) {

dvmLockMutex(&gDvm.internLock);

dvmHashForeachRemove(gDvm.internedStrings, isUnmarkedObject);

dvmUnlockMutex(&gDvm.internLock);

}

}

调用dvmHashForeachRemove,将所有单元执行isUnmarkedObject判断,所有返回1的都被表示为不可用,从而达到了清除的目的。

 

我们看到,有了哈希表的支持操作后,interned string的实现非常的直观而又简洁。 

Dalvik VM Hash - implementation

Dalvik虚拟机 之 哈希表实现篇 前面两篇分别介绍了dvm里哈希表的接口和使用。下面我们来看看dvm里哈希表是怎么实现的。   数据结构 /* * One entry in the ha...
  • rambo2188
  • rambo2188
  • 2012年03月30日 00:27
  • 2381

Dalvik vm Hash interface

Dalvik VM 哈希表 之 接口篇   几乎在所有的高级语言中都有哈希表(hashmap)的支持。它已经成为很多语言内建的数据类型。但是C语言创建较早,没有内建的哈希表类型的支持。我们只能通过...
  • rambo2188
  • rambo2188
  • 2012年03月30日 00:24
  • 2388

Android Dalvik VM内存优化之内存查看篇。

Android Dalvik VM内存优化之内存查看篇。 前序: Android采用Java语言(虽然官方认定Kotlin语言为新语言,目前已经替换中),而Java语言虚拟机为JVM,但是...
  • pd_liu_w
  • pd_liu_w
  • 2017年10月11日 20:33
  • 168

(翻译)Bytecode for the Dalvik VM -General Design

Bytecode for the Dalvik VM -General Design 以下所述的machine model和调用约定采用了一般架构和C语言调用约定来表述: Dalvi虚拟机是基于寄存...
  • kinghuangjin
  • kinghuangjin
  • 2015年05月18日 18:36
  • 624

Android Dalvik VM内存优化之内存泄露篇。

Android Dalvik VM内存优化之内存泄露篇。 虽然Dalvik VM支持垃圾收集,但是这不意味着可以不用关心内存管理。其实更应该格外注意移动设备的内存使用,毕竟其内存空间...
  • pd_liu_w
  • pd_liu_w
  • 2017年10月11日 22:45
  • 63

ovftool

OVFTOOL /Applications/VMware\ OVF\ Tool/ovftool -ds=ntnx1 -n=vm1 -nw="VM Network" CentOS.vmx vi://...
  • panlm
  • panlm
  • 2013年12月27日 12:19
  • 2296

Dalvik虚拟机的内存管理

Dalvik虚拟机的内存分为三种类型: Java Object Heap,    Bitmap Memory,   Native Heap.    下面,就这三种类型进行详细讲解:          ...
  • newjerryj
  • newjerryj
  • 2013年07月21日 15:39
  • 4264

通过dalvik code的解释执行了解dalvik bytecode结构

参考Java代码            public int Test1(int arg) {                    returnaurora.view.AuroraTest...
  • oman111
  • oman111
  • 2014年10月22日 17:42
  • 835

Dalvik漫谈

由於Dalvik所涉及的範圍不少,從JNI介面,Trace-JIT的實作,到最佳化的技巧,筆者在本文只會針對自己挑選的區塊以Android 2.2 Source Code加以說明.同樣的,所有涉及的內...
  • tuhuolong
  • tuhuolong
  • 2011年05月17日 15:11
  • 3184

Andorid ART和Dalvik比较

ART and Dalvik 官网的文字;没有时间翻译了。主要是为了记录,和便于在国内网络查看。   ...
  • wwwstudychinanet
  • wwwstudychinanet
  • 2015年10月15日 17:53
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dalvik VM Hash - how to use
举报原因:
原因补充:

(最多只允许输入30个字)