JVM原始碼分析之perfData檔案的建立

2021-09-24 06:33:27 字數 2193 閱讀 6557

看泉子的一篇文章:jvm原始碼分析之jstat工具原理完全解讀 - 你假笨 裡提到了兩個jvm引數,可以控制perfdata檔案是否共享,引用泉子對這兩個引數的解釋:

由於perfdata檔案時通過mmap共享的,因此考慮看下perfdata檔案的建立過程,看看跟mmap的map_shared和map_private兩個標誌位是如何聯絡在一起的。perfdata檔案底層是使用mmap介面實現的,而mmap介面的引數中有關於記憶體可見性的兩個引數:map_shared和map_private,如果jvm引數設定允許perfdata檔案共享,則使用map_shared標記。

perfdata檔案在jvm啟動的時候創,在init.cpp檔案中:

void

vm_init_globals

()複製**

在perfmemory.cpp檔案中看下perfmemory_init()方法,

void

perfmemory_init

()複製**

可以看出,如果useperfdata引數設定為false,則直接返回,不會建立perfdata檔案;接著看perfmemory::initialize()方法,在這個方法裡會呼叫create_memory_region(capacity);,用於申請perfdata的記憶體區域;create_memory_region這個方法不同的平台有不同的實現,我們這裡看linux平台下的實現;

看下perfmemory_linux.cpp裡的**,可以看到另一熟悉的jvm引數——perfdisablesharedmem,如果這個引數設定為false,則會建立perfdata檔案,但是其他程序無法共享這塊記憶體,會導致jps、jstat等工具無法使用;

// create the perfdata memory region

//// this method creates the memory region used to store performance

// data for the jvm. the memory may be created in standard or

// shared memory.

//void perfmemory::create_memory_region(size_t size)

else

perfdisablesharedmem = true;

_start = create_standard_memory(size);

}} if (_start != null) _capacity = size;

}複製**

首先看create_shared_memory(size)的實現: create_shared_memory(size) ——> mmap_create_shared(size)——>mapaddress = (char*)::mmap((char*)0, size, prot_read|prot_write, map_shared, fd, 0);,在這裡看到了map_shared標記。

然後看create_standard_memory(size)的實現,這裡並沒有跟之前猜想的一樣(用mmap方法建對映,傳入map_private標記),而是使用了os::reserve_memory(size)方法,用來分配一段堆記憶體。

// standard memory implementation details

// create the perfdata memory region in standard memory.

//static

char* create_standard_memory

(size_t size)

// commit memory

if (!os::commit_memory(mapaddress, size, !execmem))

os::release_memory(mapaddress, size);

return

null;

} return mapaddress;

}複製**

至此可以確認兩個結論

建立shared記憶體,使用mmap,並傳入map_shared標記

建立standard記憶體,使用os::reserve_memory分配一段堆記憶體,這點跟之前猜想的不一樣

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...