源码分析Java对象的内存分配编程开发技术.docVIP

源码分析Java对象的内存分配编程开发技术.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
源码分析Java对象的内存分配编程开发技术.doc

源码分析:Java对象的内存分配-编程开发技术 源码分析:Java对象的内存分配 原文出处:iceAeterna Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中 快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配 根据堆的实现方式、GC的实现方式、代的实现方式不同而具冇不同的分配调用 层次。 下面就以bytecodeinterpreter解释器对于new指令的解释出发,分析实例对象 的内存分配过程: 一、快速分配 实例的创建首先需要知道该类型是否被加载和止确解析,根据字节码所指定的 CONSTANT_Class_info常量池索引,获取对象的类型信息并调用 i s_unresovl ed_kl ass ()验证该类是否被解析过,在创建类的实例之询,必须确 保该类型已经痕止确加载和解析。 CASE (_new): { u2 index = Bytes::get_Java_u2(pc+1); constantPoolOop constants 二 istate-method()-constants(); if (!constants~tag_at(index). is_unresolved klass()) { 接下来获取该类型在虚拟机小的表示instanccKlass(具体可以参考前文实例 探索Java对象的组织结构) oop entry = constants-slot_at(index). get oop(); assert(entry-is_klass(), Should be resolved klass); klassOop kentry 二(klassOop) entry; assert(k_cntry-klass_part()-oop_is_instancc(), Should be instanceKlass); instanceKlass* ik = (instanceKlass*) k_entry-klass_part(); 当类型已经被初始化并且可以被快速分配吋,那么将根据UseTLAB来决定是否 使用TLAB技术(Thread-Local Al location Buffers,线程局部分配缓存技术) 來将分配工作交由线程口行完成。TLAB是每个线程在Java堆中预先分配了一小 块内存,当有对彖创建请求内存分配时,就会在该块内存上进行分配,而不需要 在Eden区通过同步控制进行内存分配。 if ( ik~is_initialized() ik-can_be_fastpath_allocated() ) { size_t obj_size = ik-size_helper(); oop result = NULL; // If the TLAB isn t pre-zeroed then we 11 have to do it bool need_zero 二!ZeroTLAB; if (UseTLAB) { result = (oop) TIlREAD-tlab(). allocate(obj_sizc); } if (result == NULL) { need_zero 二 true; 如果不使用TLAB或在TLAB上分配失败,则会尝试在堆的Eden区上进行分配。 Universe::heap()返回虚拟机内存体系所使用的CollcctcdHcap,其top aclclr () 返回的是Eden区空闲块的起始地址变量_top的地址,end addr ()是Eden区空 闲块的结朿地址变量_end的地址。故这里compare_to是Eden区空闲块的起始 地址,new_top为使用该块空闲块进行分配后新的空闲块起始地址。这里使用CAS 操作进行空闲块的同步操作,即观察_top的预期值,若与compare_to相同,即 没有其他线程操作该变量,则将ncw_top赋给/top真正成为新的空闲块起始地 址值,这种分配技术叫做bump-the-pointer (指针碰撞技术)。 retry: HeapWord* compare_to 二 *Universe::heap()-〉top addr(); HeapWord* new_top 二 compare_to + obj_size; if (new_top = *Universe::heap()-〉end_addr()) { if (Atomic::cmpxchg_ptr(ncw_top, Universe::heap()-〉top_addr(), compare_to) != compare_to) { goto retry; } resuIt 二(oop) compare_to; } 根据是否需要填0选项,对

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档