個(gè)人興趣原因, 會(huì)嘗試閱讀很多開源的框架以及語言的源代碼。也發(fā)現(xiàn)了很多精妙的位運(yùn)算, 如果本人來實(shí)現(xiàn)可能需要各種繁瑣的計(jì)算平斩。但是別的開發(fā)者大多數(shù)情況只需一句話就搞定了。感觸頗深, 現(xiàn)總結(jié)如下:
判斷val是否是2的冪次方
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
能看到該類被打上了@UnstableApi標(biāo)簽荐糜。的確在master目前已經(jīng)找不到該類的蹤跡了璃弄。
hotspot的object alignment
// 這里是向上對齊的宏肝断。比如size是20. 對齊大小alignment是8, 則嘗試對齊到24=8*3.
#define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))
// 這里是向下對齊的宏迂尝。比如size是20. 對齊大小alignment是8, 則嘗試對齊到16=8*2.
#define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))
代碼出自大名鼎鼎的hotspot。用來處理對象對齊茂蚓。詳情可見
http://hg.openjdk.java.net/jdk-updates/jdk9u/hotspot/file/22d7a88dbe78/src/share/vm/utilities/globalDefinitions.hpp#l484
typeArrayOop.hpp(2019.03.28 update)
// 這里偷了個(gè)巧壕鹉。LogHeapWordSize在64位下默認(rèn)是3, 這里等于是除以8. 然后通過左邊添加(HeapWordSize-1)來保證除后的HeapWord個(gè)數(shù)剛好能包住bytes。
julong size_in_words = ((size_in_bytes + (HeapWordSize-1)) >> LogHeapWordSize);
計(jì)算內(nèi)存對齊(2019.04.03 update)
思路是和 typeArrayOop.hpp 的方式一致聋涨。