java之堆和棧

堆和棧
 
棧與堆都是Java用來在內存中存放數據的地方。
  A.堆--用new建立,垃圾自動回收負責回收

     1、堆是一個"運行時"數據區,類實例化的對象就是從堆上去分配空間的;

     2、在堆上分配空間是通過"new"等指令建立的;

     3、Java針對堆的操作和C++的區別就是,Java不需要在空間不用的時候來顯式的釋放;

     4、Java的堆是由Java的垃圾回收機制來負責處理的,堆是動態分配內存大小,垃圾收集器可以自動回收不再使用的內存空間。

     5、但缺點是,因爲在運行時動態分配內存,所以內存的存取速度較慢。

     例:String str = new String("abc");

  B.棧--存放基本數據類型,速度快


      1、棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和對象句柄;

      2、棧的存取速度比堆要快;

      3、棧數據可以共享;

      4、棧的數據大小與生存期必須是確定的,缺乏靈活性。

      例:int a = 3;


  C.何謂棧的"數據共享


      什麼是棧的"數據共享"?


      這裏面所說的數據共享,並不是由程序員來控制的,而是JVM來控制的,指的是是系統自動處理的方式。


      比如定義兩個變量:

1 int a = 5;
2 int b = 5;

      這兩個變量所指向的棧上的空間地址是同一個,這就是所謂的"數據共享"。

      它的工作方式是這樣的:

      JVM處理int a = 5,首先在棧上創建一個變量爲a的引用,然後去查找棧上是否還有5這個值,如果沒有找到,那麼就將5存放進來,然後將a指向5。接着處理int b = 5,在創建完b的引用後,因爲在棧中已經有5這個值,便將b直接指向5。於是,就出現了a與b同時指向5的內存地址的情況。

   D.實例化對象的兩種方法

        對於String這個類來說它可以用兩種方法進行建立:

String s = new String("asdf"); 

                                       和

String s = "asdf"; 

        用這兩個形式創建的對象是不同的,第一種是用new()來創建對象的,它是在堆上開闢空間,每調用一次都會在堆上創建一個新的對象。

而第二種的創建方法則是先在棧上創建一個String類的對象引用,然後再去查找棧中有沒有存放"asdf",如果沒有,則將"asdf"存放進棧,並讓str指向"asdf",如果已經有"asdf" 則直接把str指向"abc"。

       我們在比較兩個String是否相等時,一定是用"equals()"方法,而當測試兩個包裝類的引用是否指向同一個對象時,我們應該用"= ="。

因此,我們可以通過"= ="判斷是否相等來驗證棧上面的數據共享的問題。

        例1:

1 String s1 = "asdf"
2 String s2 = "asdf"
3 System.out.println(s1==s2);

        該程序的運行結果是,"true",那麼這說明"s1"和"s2"都是指向同一個對象的。

       例2:

1 String s1 =new String ("asdf"); 
2 String s2 =new String ("asdf"); 
3 System.out.println(s1==s2);

        該程序的運行結果是,"false",這說明用new的方式是生成的對象,每個對象都指向不同的地方。


兩個讀取內存信息函數

    A.Java給我們提供了讀取內存信息的函數,這兩個函數分別是:


         1、Runtime.getRuntime().maxMemory()

           得到虛擬機可以控制的最大內存數量。

         2、Runtime.getRuntime().totalMemory()

           得到虛擬機當前已經使用的內存數量。

   


   B.開發Java程序內存看的見

             爲了看看這兩個函數的運行效果,我們可以編一個小程序來看看這兩個程序的實際運行效果,讓大家也對內存的佔用情況做到"看得見摸得着"。

 1 public class MemoryTest{
 2 public static void main(String args[]){
 3 String s="abcdefghijklmnop";
 4 System.out.print("maxMemory:");
 5 System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
 6 System.out.print("totalMemory:");
 7 System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
 8 for(int i=0;i<19;i++){
 9 s=s+s;
10 }
11 System.out.print("totalMemory:");
12 System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
13 }
14 }

這個程序運行效果如下圖 3 1所示。


          


           


        從這個程序的輸出結果可以發現兩個值得注意的地方:

        1、竟然虛擬機可以控制的最大內存數量只有63M,也就是說,稍微不留神就會發生內存溢出。

        2、在不斷的向String中追加字符的情況下,所佔用的內存在不斷的增長。

        不是開玩笑,Java虛擬機在默認的情況下只能控制"66650112 byte"即"63.56M"。那麼,我們如何才能讓Java虛擬機能夠控制更多的內存呢?

  


4.3.3 必須要介紹的虛擬機的參數"-Xmx"

Java程序員往往似乎已經習慣了使用:

java -classpath program [回車]

來啓動Java應用程序,這是用於一般程序的啓動方式。其實JVM其中的相關參數還是有很多的,而這些參數對於應用程序的運行是非常有用的。

我們可以進入Windows的cmd控制檯窗口,鍵入如下指令:

java [回車]

在屏幕上可以看到如下內容:

 

其他參數基本上都有相關說明,我們不在這裏贅述,現在只關注其中的"-X"這參數。"-X"的說明中說:"print help on non-standard options",意思是"打印非標準配置參數的幫助信息",也就是說,如果直接鍵入"java -X"的話,將會看到非標準參數的說明。

好,繼續在CMD中鍵入:

java -X [回車]

運行後得到了如下結果:

 

現在仍然不管其他參數只看有用的幾個參數:

-Xms<size> set initial Java heap size
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            設置JVM初始化堆內存大小
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            -Xmx<size> set maximum Java heap size
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            設置JVM最大的堆內存大小
-Xss<size> set java thread stack size
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            設置JVM棧內存大小

從這些參數的說明中得知,我們可以通過這些非標準參數來制定JVM可以控制的堆內存的大小。只需要在Java命令後面加入一個參數"-Xmx",這個參數可以指定虛擬機可以控制的內存數量,這個函數我們在前面章節也曾經見過,在這裏對其詳細說明一下。

例如如下命令:

java -Xmx1024m -classpath ……

這個命令就代表Java虛擬機控制的內存爲1G,需要注意的是"-Xmx"和"1024m"之間沒有空格,另外,"1024m"也可以不用"m"而 直接寫字節數,但是必須寫字節數,如還是1G應該寫成"1024000000"和"1024m"代表同樣的意思。還是上一個小節的那個程序如果我們加 上"-Xmx1024m"參數以後,運行結果如圖 3 2所示。

           

     通過我們對虛擬機相關參數及測試方法的瞭解,使我們做到了Java內存控制明明白白、心中有數。心中有數了,那就想辦法讓程序的內存使用效率更高一些吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章