欢迎来到天天文库
浏览记录
ID:30853737
大小:240.36 KB
页数:13页
时间:2019-01-04
《源码分析:java对象的内存分配-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、源码分析:Java对象的内存分配-编程开发技术源码分析:Java对象的内存分配原文出处:iceAeternaJava对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式、GC的实现方式、代的实现方式不同而具冇不同的分配调用层次。下面就以bytecodeinterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程:一、快速分配1.实例的创建首先需要知道该类型是否被加载和止确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调用is_
2、unresovled_klass()验证该类是否被解析过,在创建类的实例之询,必须确保该类型已经痕止确加载和解析。CASE(_new):{u2index=Bytes::get_Java_u2(pc+1);constantPoolOopconstants二istate->method()->constants();if(!constants~>tag_at(index).is_unresolvedklass()){2.接下来获取该类型在虚拟机小的表示instanccKlass(具体可以参考前文实例探索Java对象的组织结构)oopentry=constants->slot_at(index).
3、getoop();assert(entry->is_klass(),"Shouldberesolvedklass");klassOopkentry二(klassOop)entry;assert(k_cntry->klass_part()->oop_is_instancc(),"ShouldbeinstanceKlass");instanceKlass*ik=(instanceKlass*)k_entry->klass_part();3.当类型已经被初始化并且可以被快速分配吋,那么将根据UseTLAB来决定是否使用TLAB技术(Thread-LocalAllocationBuffers,线程局
4、部分配缓存技术)來将分配工作交由线程口行完成。TLAB是每个线程在Java堆中预先分配了一小块内存,当有对彖创建请求内存分配时,就会在该块内存上进行分配,而不需要在Eden区通过同步控制进行内存分配。if(ik~>is_initialized()&&ik->can_be_fastpath_allocated()){size_tobj_size=ik->size_helper();oopresult=NULL;//IftheTLABisntpre-zeroedthenwe'11havetodoitboolneed_zero二!ZeroTLAB;if(UseTLAB){result=(oop)T
5、IlREAD->tlab().allocate(obj_sizc);}if(result==NULL){need_zero二true;1.如果不使用TLAB或在TLAB上分配失败,则会尝试在堆的Eden区上进行分配。Universe::heap()返回虚拟机内存体系所使用的CollcctcdHcap,其topaclclr()返回的是Eden区空闲块的起始地址变量_top的地址,endaddr()是Eden区空闲块的结朿地址变量_end的地址。故这里compare_to是Eden区空闲块的起始地址,new_top为使用该块空闲块进行分配后新的空闲块起始地址。这里使用CAS操作进行空闲块的同步操
6、作,即观察_top的预期值,若与compare_to相同,即没有其他线程操作该变量,则将ncw_top赋给/top真正成为新的空闲块起始地址值,这种分配技术叫做bump-the-pointer(指针碰撞技术)。retry:HeapWord*compare_to二*Universe::heap()-〉topaddr();HeapWord*new_top二compare_to+obj_size;if(new_top<=*Universe::heap()-〉end_addr()){if(Atomic::cmpxchg_ptr(ncw_top,Universe::heap()-〉top_addr()
7、,compare_to)!=compare_to){gotoretry;}resuIt二(oop)compare_to;}2.根据是否需要填0选项,对分配空间的对彖数据区进行填0if(result!二NULL){//Initializeobject(ifnonzerosizeandneed)andthentheheaderif(need_zero){HeapWord*to_zero二(HeapWord*)re
此文档下载收益归作者所有