<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yaoyaojj

    yaoyao

    常用鏈接

    統計

    最新評論

    2011年7月31日 #

    java虛擬機內存的堆區(heap),棧區(stack)和靜態區(static/method)

    JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)

    堆區:
    1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
    2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身.

    3.一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。

    棧區:
    1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
    2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
    3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。


    4.由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等.

     

     

     

    靜態區
    /方法區:
    1.方法區又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
    2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

    3.—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。


    代碼實例(轉自網絡)

    AppMain.java
     
    public   class  AppMain //運行時, jvm 把appmain的信息都放入方法區
    {
        
    public   static   void  main(String[] args)  //main 方法本身放入方法區。
        {
             Sample test1 
    = new  Sample( " 測試1 " );   //test1是引用,所以放到棧區里, Sample是自定義對象應該放到堆里面
              Sample test2 = new  Sample( " 測試2 " );

             test1.printName();
             test2.printName();
        }
    }

    Sample.java

    public   class  Sample //運行時, jvm 把appmain的信息都放入方法區
    {
         
    /** 范例名稱 */
         
    private  name; //new Sample實例后, name 引用放入棧區里,  name 對象放入堆里

          
    /** 構造方法 */
         
    public  Sample(String name)
         {
              
    this .name = name;
         }

         
    /** 輸出 */
         
    public   void  printName()   //print方法本身放入 方法區里。
         {
             System.out.println(name);
         }
    }

    代碼的執行過程:
    系統收到了我們發出的指令,啟動了一個Java虛擬機進程,這個進程首先從classpath中找到AppMain.class文件,讀取這個文件中的二進制數據,然后把Appmain類的類信息存放到運行時數據區的方法區中。這一過程稱為AppMain類的加載過程。
    接著,Java虛擬機定位到方法區中AppMain類的Main()方法的字節碼,開始執行它的指令。這個main()方法的第一條語句就是:
    Sample test1
    =new Sample("測試1");


    語句很簡單啦,就是讓java虛擬機創建一個Sample實例,并且呢,使引用變量test1引用這個實例。貌似小case一樁哦,就讓我們來跟蹤一下Java虛擬機,看看它究竟是怎么來執行這個任務的:


    1、 Java虛擬機一看,不就是建立一個Sample實例嗎,簡單,于是就直奔方法區而去,先找到Sample類的類型信息再說。結果呢,嘿嘿,沒找到@@,這會兒的方法區里還沒有Sample類呢。可Java虛擬機也不是一根筋的笨蛋,于是,它發揚“自己動手,豐衣足食”的作風,立馬加載了Sample類,把Sample類的類型信息存放在方法區里。


    2、 好啦,資料找到了,下面就開始干活啦。Java虛擬機做的第一件事情就是在堆區中為一個新的Sample實例分配內存, 這個Sample實例持有著指向方法區的Sample類的類型信息的引用。這里所說的引用,實際上指的是Sample類的類型信息在方法區中的內存地址,其實,就是有點類似于C語言里的指針啦~~,而這個地址呢,就存放了在Sample實例的數據區里。

     
     

     
    3、 在JAVA虛擬機進程中,每個線程都會擁有一個方法調用棧,用來跟蹤線程運行中一系列的方法調用過程,棧中的每一個元素就被稱為棧幀,每當線程調用一個方法的時候就會向方法棧壓入一個新幀。這里的幀用來存儲方法的參數、局部變量和運算過程中的臨時數據。OK,原理講完了,就讓我們來繼續我們的跟蹤行動!位于“=”前的Test1是一個在main()方法中定義的變量,可見,它是一個局部變量,因此,它被會添加到了執行main()方法的主線程的JAVA方法調用棧中。而“=”將把這個test1變量指向堆區中的Sample實例,也就是說,它持有指向Sample實例的引用。
    OK,到這里為止呢,JAVA虛擬機就完成了這個簡單語句的執行任務。參考我們的行動向導圖,我們終于初步摸清了JAVA虛擬機的一點點底細了,COOL!
    接下來,JAVA虛擬機將繼續執行后續指令,在堆區里繼續創建另一個Sample實例,然后依次執行它們的printName()方法。當JAVA虛擬機執行test1.printName()方法時,JAVA虛擬機根據局部變量test1持有的引用,定位到堆區中的Sample實例,再根據Sample實例持有的引用,定位到方法去中Sample類的類型信息,從而獲得printName()方法的字節碼,接著執行printName()方法包含的指令。

     轉
    http://blog.csdn.net/lyerliu/article/details/6311709

    posted @ 2011-07-31 14:51 水木清華77 閱讀(1483) | 評論 (0)編輯 收藏

    2011年7月4日 #

    八皇后問題的解決

     1 package algorithm;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class Queen {
     7     private int count = 0;
     8 
     9     public static void main(String[] args) {
    10         long start = System.currentTimeMillis();
    11         List<Integer> list = new ArrayList<Integer>();
    12         Queen queen = new Queen();
    13         queen.findMyQueen(list);
    14 
    15         long end = System.currentTimeMillis();
    16         System.out.println("搜索時間"+(end - start)+"ms");
    17         System.out.println("總共解法"+queen.count);
    18     }
    19 
    20     /**
    21      * 建立一個隊列 list 用于存放八個皇后
    22      */
    23     public void findMyQueen(List<Integer> list) {
    24 
    25         if (list.size() == 8) {
    26             count++;
    27             System.out.println("" + count + "");
    28             for (int queen : list) {
    29 
    30                 for (int k = 0; k < 8; k++) {
    31                     if ((queen >> k) == 1) {
    32                         System.out.print(" Q ");
    33                     } else {
    34                         System.out.print(" . ");
    35                     }
    36                 }
    37                 System.out.println();
    38 
    39             }
    40 
    41             return;
    42         }
    43         for (int i = 0; i < 8; i++) {
    44             /**
    45              * 清理list
    46              */
    47 
    48             int myQueen = 1 << i;
    49             if (list.size() == 0) {// 如果的長度是0的話 初始狀態
    50                 list.add(myQueen);
    51                 int size = list.size();
    52                 findMyQueen(list);
    53                 clear(list, size);
    54             } else {
    55                 int isFind = 1;
    56                 for (int j = 0; j < list.size(); j++) {
    57                     int queen = list.get(j);
    58                     if ((queen & myQueen) != 0) {
    59                         isFind = 0;
    60                         break;
    61                     }
    62                     if (queen != (1 << 7)) {
    63                         int queenLeft = queen << (list.size() - j);
    64                         if (queenLeft <= (1 << 7))
    65                             if ((queenLeft & myQueen) != 0) {
    66 
    67                                 isFind = 0;
    68                                 break;
    69                             }
    70                     }
    71                     if (queen != 1) {
    72                         int queenRight = queen >> (list.size() - j);
    73                         if ((queenRight & myQueen) != 0) {
    74                             isFind = 0;
    75                             break;
    76                         }
    77                     }
    78                 }
    79                 if (isFind == 1) {
    80                     list.add(myQueen);
    81                     int size = list.size();
    82                     findMyQueen(list);
    83                     clear(list, size);
    84                 }
    85 
    86             }
    87 
    88         }
    89 
    90     }
    91 
    92     void clear(List<Integer> list, int index) {
    93         for (int i = index - 1; i < list.size(); i++)
    94             list.remove(i);
    95 
    96     }
    97 }
    98 

    list用來存放皇后隊列
    如果回溯的過程中沒有找到合適的皇后  則會進行清空的操作(刪去一個皇后)

    解決八皇后問題的核心算法  首先當然是回溯

    我自己使用的是8位取&的操作  用來判斷下一個皇后的位置正確與否
    皇后左移/右移  之后與現在正在處理的皇后進行&操作    移位的規則是隊列中的皇后與現在要處理的皇后的行的間距

    posted @ 2011-07-04 11:05 水木清華77 閱讀(247) | 評論 (0)編輯 收藏

    僅列出標題  
    主站蜘蛛池模板: 国内精品久久久久影院亚洲 | 一本色道久久88亚洲精品综合 | 国产又黄又爽又刺激的免费网址 | 亚洲人成网www| 香港a毛片免费观看 | 亚洲成a人片在线观看播放| 91精品国产免费| 在线免费观看亚洲| 在线视频免费观看爽爽爽| 亚洲人成77777在线观看网| 毛片免费观看的视频在线| 亚洲人成网站18禁止| 日本特黄特色免费大片| 黄页视频在线观看免费| 一本色道久久综合亚洲精品高清| a级毛片黄免费a级毛片| 久久久影院亚洲精品| 2021久久精品免费观看| 亚洲Av无码国产一区二区| 亚洲精品久久久www| 日韩视频免费在线观看| 亚洲日本香蕉视频| 国产男女猛烈无遮档免费视频网站 | 亚洲成av人片天堂网无码】| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 日本免费xxxx| 含羞草国产亚洲精品岁国产精品| 免费在线黄色网址| 无码精品人妻一区二区三区免费看| 亚洲精品中文字幕无码AV| 免费观看的毛片手机视频| eeuss草民免费| 亚洲精品综合久久中文字幕| 无码人妻精品一二三区免费| 有色视频在线观看免费高清在线直播| 久久国产亚洲电影天堂| 日本免费一区二区三区最新| 久久久久久久久久免免费精品| 亚洲欧洲日产国产最新| 免费一区二区视频| 亚洲啪啪免费视频|