个人兴趣原因, 会尝试阅读很多开源的框架以及语言的源代码。也发现了很多精妙的位运算, 如果本人来实现可能需要各种繁琐的计算。但是别的开发者大多数情况只需一句话就搞定了。感触颇深, 现总结如下:
判断val是否是2的幂次方
private static boolean isPowerOfTwo(int val) {
return (val & -val) == val;
}
能看到该类被打上了@UnstableApi标签。的确在master目前已经找不到该类的踪迹了。
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)
// 这里偷了个巧。LogHeapWordSize在64位下默认是3, 这里等于是除以8. 然后通过左边添加(HeapWordSize-1)来保证除后的HeapWord个数刚好能包住bytes。
julong size_in_words = ((size_in_bytes + (HeapWordSize-1)) >> LogHeapWordSize);
计算内存对齐(2019.04.03 update)
思路是和 typeArrayOop.hpp 的方式一致。
网友评论