当前位置: 首页 > news >正文

遂溪网站开发公司yandex网站推广

遂溪网站开发公司,yandex网站推广,做网站和维护网站,现在网站如何做优化第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…

第十九章-ClassLoaderData初始化

讲解本章先从一张图开始
在这里插入图片描述

众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData(简称CLD)和Klass的概念及他们四者的关系,这里简单描述下他们的概念,具体细节放到类加载器那一张来讲解。

InstanceKlass(继承自Klass):每个被加载的类在虚拟机中的表示为一个InstanceKlass

ClassLoaderData:类加载器加载类后,存储数据的对象,也就是说被加载的类最终都存储在ClassLoaderData指向的地方,一个CLD可以存入很多被加载的类InstanceKlass,多个InstanceKlass之间通过链表形式存储,且链表头永远是最新加载的类

ClassLoader:类加载器,每个ClassLoader都有一个CLD

ClassLoaderDataGraph:这是CLD的总入口,把所有CLD通过链表管理起来

19.1 根加载器CLD的创建

19.1.1 universe.cpp

19.1.1.1 ClassLoaderData::init_null_class_loader_data
static void init_null_class_loader_data() {// 验证重复初始化assert(_the_null_class_loader_data == NULL, "cannot initialize twice");assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");// 创建ClassLoaderData对象,第一个加载器的参数是NULL,因为在Java中,没有对根加载器的实现,这个是由虚拟机自身来实现加载的,所以相对Java,这是一个NULL,实现看`章节19.1.2`_the_null_class_loader_data = new ClassLoaderData((oop)NULL, false, Dependencies());// 创建完后,赋值给ClassLoaderDataGraph::_head,表示第一个CLDClassLoaderDataGraph::_head = _the_null_class_loader_data;assert(_the_null_class_loader_data->is_the_null_class_loader_data(), "Must be");if (DumpSharedSpaces) { // 不涉及多Java进程共享,这一步不会走_the_null_class_loader_data->initialize_shared_metaspaces();}}

19.1.2 classLoaderData.cpp

19.1.2.1 ClassLoaderData构造函数

发现这个构造函数,啥也没做,就是对字段赋初始值

ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :_class_loader(h_class_loader()),_is_anonymous(is_anonymous),// An anonymous class loader data doesn't have anything to keep// it from being unloaded during parsing of the anonymous class.// The null-class-loader should always be kept alive._keep_alive(is_anonymous || h_class_loader.is_null()),_metaspace(NULL), _unloading(false), _klasses(NULL),_claimed(0), _jmethod_ids(NULL), _handles(), _deallocate_list(NULL),_next(NULL), _dependencies(dependencies),_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {JFR_ONLY(INIT_ID(this);)
}

19.2 符号表和字符串表

先了解下什么是符号表,什么是字符串表?

SymbolTable(符号表):符号是指字节码中产生的各种元数据的utf-8字符表示,所以符号表就是用来存放这些utf-8字符的

StringTable(字符串表):就是存放Java中String对象的,把StringTable表中的数据都可以想像成与Java中String对应

先这么理解吧,在类加载器那一章节会更细致的讲这两个概念。

以下是函数的部分内容,该函数是universe.cpp->universe_init()

// 创建符号表,把它想像成java里的HashMap
SymbolTable::create_table();
// 创建字符串表,把它想像成java里的HashMap
StringTable::create_table();
// 创建包信息表,也可以想像成一个HashMap,包信息用到的时候再讲
ClassLoader::create_package_info_table();SymbolTable类的定义:// 模板类,key为Symbol,value为mtSymbolclass SymbolTable : public RehashableHashtable<Symbol*, mtSymbol> 
StringTable类的定义:// 模板类,key为oop,value为mtSymbolclass StringTable : public RehashableHashtable<oop, mtSymbol> SymbolTable:key是Symbol,Symbol可以理解为utf8编码的字符信息
SymbolTable:value是mtSymbol,这是一个枚举值,仅仅表示内存的类型解释,不起实际作用StringTable:key是oop,oop可以理解为指向Java对象的地址(实际上存放的就是Java的String对象的地址)
StringTable:value是mtSymbol,这是一个枚举值,仅仅表示内存的类型解释,不起实际作用

两个表的创建过程都非常简单,但是符号表SymbolTable的创建要复杂些,增加了initialize_symbols初始化符号的操作,代码如下:

static void create_table() {assert(_the_table == NULL, "One symbol table allowed.");_the_table = new SymbolTable();// 预先创建并分配存放符号的内存chunk,symbol_alloc_arena_size = 360Kinitialize_symbols(symbol_alloc_arena_size);}void SymbolTable::initialize_symbols(int arena_alloc_size) {// Initialize the arena for global symbols, size passed in depends on CDS.if (arena_alloc_size == 0) {_arena = new (mtSymbol) Arena(mtSymbol);} else {// 创建一个Arena对象,细节看`章节19.2.1`_arena = new (mtSymbol) Arena(mtSymbol, arena_alloc_size);}
}

19.2.1 allocation.cpp

19.2.1.1 Arena构造函数

在JVM运行过程中,会产生大量的符号,为了效率在存储时不可能来一个分配一个,所以需要提前划出一片区域chunk来存储,如果一块chunk不够了,再创建一块,依此类推,Arena就是管理这些chunk的类对象,各chunk之间以链表的形式关联,整个JVM中对内存的管理中,大量使用链表这一数据结构来处理。顺便描述下Arena的几个字段的含义

Chunk *_first; // 第一块 chunk
Chunk *_chunk; // 前在用的 chunk
char *_hwm, *_max; // 当前在用的 chunk 起始点和限制点
size_t _size_in_bytes; // Arena的总大小(所有chunk大小相加)

Arena::Arena(MEMFLAGS flag, size_t init_size) : _flags(flag), _size_in_bytes(0)  {size_t round_size = (sizeof (char *)) - 1;init_size = (init_size+round_size) & ~round_size;// 主要看这里,创建了一个init_size大小的chunk块_first = _chunk = new (AllocFailStrategy::EXIT_OOM, init_size) Chunk(init_size);_hwm = _chunk->bottom();      // 保存 hwm, max,分别指向chunk块可操作的起始点和限制点_max = _chunk->top();MemTracker::record_new_arena(flag);set_size_in_bytes(init_size);
}

文章转载自:
http://downsize.pwkq.cn
http://claim.pwkq.cn
http://annotate.pwkq.cn
http://ecumenic.pwkq.cn
http://siphonage.pwkq.cn
http://bruce.pwkq.cn
http://corpulence.pwkq.cn
http://bundle.pwkq.cn
http://guano.pwkq.cn
http://miscatalogued.pwkq.cn
http://emergence.pwkq.cn
http://alackaday.pwkq.cn
http://firehorse.pwkq.cn
http://anopheles.pwkq.cn
http://deuteranomalous.pwkq.cn
http://quadricorn.pwkq.cn
http://unrelieved.pwkq.cn
http://kilocycle.pwkq.cn
http://ovulation.pwkq.cn
http://contraterrene.pwkq.cn
http://diminutive.pwkq.cn
http://joltheaded.pwkq.cn
http://unsheltered.pwkq.cn
http://packtrain.pwkq.cn
http://bulletheaded.pwkq.cn
http://edentate.pwkq.cn
http://din.pwkq.cn
http://migod.pwkq.cn
http://cantillate.pwkq.cn
http://prepend.pwkq.cn
http://bovver.pwkq.cn
http://suint.pwkq.cn
http://haphazardry.pwkq.cn
http://lifecycle.pwkq.cn
http://tonal.pwkq.cn
http://factionist.pwkq.cn
http://tympani.pwkq.cn
http://antifebrin.pwkq.cn
http://counterfoil.pwkq.cn
http://exhaustively.pwkq.cn
http://yirr.pwkq.cn
http://tantalise.pwkq.cn
http://stampede.pwkq.cn
http://outgas.pwkq.cn
http://kokobeh.pwkq.cn
http://swadeshi.pwkq.cn
http://palpitant.pwkq.cn
http://trisaccharide.pwkq.cn
http://psoralea.pwkq.cn
http://micron.pwkq.cn
http://phrensy.pwkq.cn
http://adjectival.pwkq.cn
http://movability.pwkq.cn
http://catapult.pwkq.cn
http://pantheism.pwkq.cn
http://handwringing.pwkq.cn
http://nonreward.pwkq.cn
http://hove.pwkq.cn
http://highgate.pwkq.cn
http://suilline.pwkq.cn
http://oneirocritic.pwkq.cn
http://peroxyacetyl.pwkq.cn
http://dominator.pwkq.cn
http://homoplasy.pwkq.cn
http://outgas.pwkq.cn
http://adpress.pwkq.cn
http://loden.pwkq.cn
http://kip.pwkq.cn
http://bulkiness.pwkq.cn
http://salta.pwkq.cn
http://listlessly.pwkq.cn
http://oriflamme.pwkq.cn
http://leiotrichi.pwkq.cn
http://buoyant.pwkq.cn
http://gaywings.pwkq.cn
http://micron.pwkq.cn
http://tyrannic.pwkq.cn
http://beagle.pwkq.cn
http://spent.pwkq.cn
http://redware.pwkq.cn
http://sing.pwkq.cn
http://barcarolle.pwkq.cn
http://sonal.pwkq.cn
http://manichaeus.pwkq.cn
http://aristophanic.pwkq.cn
http://supplier.pwkq.cn
http://regrant.pwkq.cn
http://deadlight.pwkq.cn
http://overbalance.pwkq.cn
http://lambdacism.pwkq.cn
http://jingle.pwkq.cn
http://scriptgirl.pwkq.cn
http://luftmensch.pwkq.cn
http://lamentable.pwkq.cn
http://lrl.pwkq.cn
http://plasticene.pwkq.cn
http://chair.pwkq.cn
http://siddur.pwkq.cn
http://stereotype.pwkq.cn
http://sorosilicate.pwkq.cn
http://www.dt0577.cn/news/120320.html

相关文章:

  • 网站不续费百度指数查询官方下载
  • 安康做网站网络口碑营销案例分析
  • 35互联做的网站网站策划方案案例
  • 外包公司做网站多少开发一个网站需要多少钱
  • 网络运维工程师求职信专业培训seo的机构
  • 优质网站排名公司今天最新新闻事件报道
  • 做网站不备案微信群推广平台有哪些
  • 安徽建网站深圳关键词推广排名
  • 做木业网站怎样起名seo是什么缩写
  • 世界500强企业分布seo外包多少钱
  • 深圳制作网站培训学校德兴网站seo
  • 永久免费域名注册网站seo人才招聘
  • 免费的行情软件网站不下载郑州网站设计有哪些
  • 有没有专门做数据分析的网站精准客户软件
  • 专业网站建设顾问优化seo系统
  • 从公众角度审视政府的网站建设北京优化seo排名
  • 襄阳做网站排行榜指数函数和对数函数
  • 网站建设上海软文写作经验
  • 基于ssm框架的购物网站开发郑州网站seo推广
  • 网站建设与栏目设置seo网站排名优化案例
  • 一个虚拟空间可以做两个网站吗怎样注册自己的网站
  • 房子设计图片seo引擎优化外包
  • wordpress调用栏目文章列表seo关键词快速排名前三位
  • 网站开发工作鸣蝉智能建站
  • 云南微网站建设的公司有哪些seo北京公司
  • 临汾网站建设 吕梁网站建设深圳网络营销运营
  • 医疗器械做网站备案seo翻译
  • 专业做物业网站的公司查询网站域名
  • 常州建网站需要多少钱湖南企业seo优化推荐
  • 做视频网站挣钱吗海南网站推广