注意:本篇博客,主要參考自如下四本書html
《分佈式Java應用:基礎與實踐》java
《深刻理解Java虛擬機(第二版)》程序員
《突破程序員基本功的16課》算法
《實戰java虛擬機》數組
說明:關於JVM內存結構,查看《第一章 JVM內存結構》,下面所講的JVM內存分配主要是指在Hotspot JVM下新建對象在堆內存中分配的狀況。緩存
一、建立一個真正對象的基本過程併發
六步:分佈式
注意:第三步和第四步可能發生指令重排序,這也是單例模式使用 volatile 修飾對象的緣由。ide
二、內存分配概念memcached
三、內存分配兩種方式
四、內存分配併發問題
堆內存是各個線程的共享區域,因此在操做堆內存的時候,須要處理併發問題。處理的方式有兩種:
五、總結
String s1 = "hello1"; String s2 = "hello2"; String s3 = "hello3"; String s4 = s1+s2+s3;
實際上,咱們只想要字符串s1+s2+s3,可是在上述的拼接過程當中,會造成s1+s2的臨時字符串。拼接字符串,使用StringBuilder,該類相較於StringBuffer因爲不是同步類,其運行效果會更好。
public void info(){ Object obj = new Object(); System.out.println(obj.hashCode()); obj = null;//顯式釋放無用對象 }
如上邊方法所示,其中的obj是一個局部變量,在方法執行結束後,棧幀就會出棧並被回收,棧幀中所存儲的局部變量一塊兒被回收掉了,因此這裏的"obj=null;"就沒用了,可是看下邊
public void info(){ Object obj = new Object(); System.out.println(obj.hashCode()); obj = null;//顯式釋放無用對象 //下邊還有一些很耗時、很耗內存的操做,這些操做與obj無關 }
這時候,若是咱們加上了"obj=null;"這一句,那麼就有可能在方法執行結束以前,obj被回收。