哪個更快:Java堆還是本地記憶體
使用Java的一個好處就是你可以不用親自來管理記憶體的分配和釋放。當你用new
關鍵字來例項化一個物件時,它所需的記憶體會自動的在Java堆中分配。堆會被垃圾回收器進行管理,並且它會在物件超出作用域時進行記憶體回收。但是在JVM中有一個‘後門’可以讓你訪問不在堆中的本地記憶體(native
memory)。在這篇文章中,我會給你演示一個物件是怎樣以連續的位元組碼的方式在記憶體中進行儲存,並且告訴你是應該怎樣儲存這些位元組,是在Java堆中還是在本地記憶體中。最後我會就怎樣從JVM中訪問記憶體更快給一些結論:是用Java堆還是本地記憶體。
使用Unsafe
來分配和回收記憶體
sun.misc.Unsafe
malloc
和free
。通過它分配的記憶體不在Java堆中,並且不受垃圾回收器的管理,因此在它被使用完的時候你需要自己來負責釋放和回收。下面是我寫的一個使用Unsafe
來管理本地記憶體的一個工具類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
public
class
Direct implements
Memory {
private
static
Unsafe unsafe;
private
static
boolean
AVAILABLE = false ;
static
{
try
{
Field
field = Unsafe. class .getDeclaredField( "theUnsafe" );
field.setAccessible( true );
|