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

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

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

    莊周夢(mèng)蝶

    生活、程序、未來
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

        讀《Perl語(yǔ)言入門》(第四版,我買的書,網(wǎng)上有個(gè)翻譯質(zhì)量很高的電子版)的第10章的習(xí)題,人見人愛的猜數(shù)游戲,用perl寫出來大概這樣:
    $num=int (1 + rand 100);
    print "I have a number,guess it?:\n";
    while(<>)
    {
        
    chomp;
        
    next unless /\d+/;
        
    $_>$num? print "Too high\n" :
            
    $_==$num? last :print "Too low\n"
    }
       題外話:玩Perl的高人們別鄙視我,我是perl新手啊,如果寫的不夠“perl”,多多指點(diǎn)。
      
       這段代碼轉(zhuǎn)成ruby,可以這樣寫:

    $num=1+(rand 100)
    puts 
    "I have a number guess it?"
    while(true)
       gets.chomp
       next unless 
    ~/\d+/
         $_.to_i
    >$num?begin print "Too high\n" end:
           $_.to_i
    ==$num? begin break end:begin print "Too low\n" end
        
    end

        看出來了吧,兩者何其相似啊,包括perl里面人見人愛的$_,ruby也是支持的,唯一那么一點(diǎn)不同的地方就是last換成了break,然后是正則表達(dá)式左邊多了個(gè)~,你完全可以將這個(gè)符號(hào)去掉,不過會(huì)有警告,最后就是Ruby中的要執(zhí)行的表達(dá)式得放在begin...end里面,這一點(diǎn)讓我琢磨了一段時(shí)間,還以為Ruby不支持呢。讀《Perl語(yǔ)言入門》最大的樂趣除了妙趣橫生的語(yǔ)言、古靈精怪的符號(hào)之外,就是尋找Ruby中的Perl痕跡,哦哦,那個(gè)味道相當(dāng)重——駱駝的味道。不過現(xiàn)在Ruby不鼓勵(lì)這樣的寫法,畢竟,程序是給人讀的,因此可以改寫一下:
    $num=1+(rand 100)
    puts "I have a number guess it?"
    while(true)
       guess
    =STDIN.gets
       next unless guess
    =~/\d+/
       
    if(guess.to_i>$num)
          puts 
    "Too high"
       elsif(guess.to_i
    ==$num)
          
    break
       
    else
          puts 
    "Too low"
       end
    end

    posted @ 2007-12-07 16:30 dennis 閱讀(2209) | 評(píng)論 (1)編輯 收藏

        先是讀《Programming in Lua》第9章講coroutine,然后去google coroutine,找到Simon Tatham寫的一篇coroutine in c,講怎么在C語(yǔ)言中實(shí)現(xiàn)coroutine,文中先ugly地基于棧實(shí)現(xiàn)了一個(gè):
    int function(void) {
        
    static int i, state = 0;
        
    switch (state) {
            
    case 0goto LABEL0;
            
    case 1goto LABEL1;
        }
        LABEL0: 
    /* start of function */
        
    for (i = 0; i < 10; i++) {
            state 
    = 1/* so we will come back to LABEL1 */
            
    return i;
            LABEL1:; 
    /* resume control straight after the return */
        }
    }

    這個(gè)方法簡(jiǎn)單,但是相當(dāng)丑陋,你必須手工維護(hù)這些標(biāo)簽。然后提到了Duff's Device技巧:
    switch (count % 8) {
            
    case 0:        do {  *to = *from++;
            
    case 7:              *to = *from++;
            
    case 6:              *to = *from++;
            
    case 5:              *to = *from++;
            
    case 4:              *to = *from++;
            
    case 3:              *to = *from++;
            
    case 2:              *to = *from++;
            
    case 1:              *to = *from++;
                           } 
    while ((count -= 8> 0);
        }

    這段代碼能編譯通過嗎?能的,不信你試試,這是一段用于拷貝數(shù)組的代碼,我們一般拷貝數(shù)組是這樣做的:
    send(to, from, count)
            register 
    short *to, *from;
            register count;
            {
                    
    do
                            
    *to = *from++;
                    
    while(--count>0);
            }
    如果循環(huán)的中的操作足夠快,那么其實(shí)大部分時(shí)間都是浪費(fèi)在判斷循環(huán)條件上面的,而通過Duff's Device通過switch語(yǔ)句將要進(jìn)行的連續(xù)循環(huán)操作的次數(shù)進(jìn)行了預(yù)判(根據(jù)擦case語(yǔ)句的位置)然后依次執(zhí)行,而不必每次都去進(jìn) 行測(cè)試條件,從而加速循環(huán)。這個(gè)技巧怎么應(yīng)用于實(shí)現(xiàn)更優(yōu)雅的coroutine呢?看代碼

    int function(void) {
        
    static int i, state = 0;
        
    switch (state) {
            
    case 0/* start of function */
            
    for (i = 0; i < 10; i++) {
                state 
    = 1/* so we will come back to "case 1" */
                
    return i;
                
    case 1:; /* resume control straight after the return */
            }
        }
    }
    更好的方式是使用宏:
    #define crBegin static int state=0; switch(state) { case 0:
    #define crReturn(i,x) do { state=i; return x; case i:; } while (0)
    #define crFinish }
    int function(void) {
        
    static int i;
        crBegin;
        
    for (i = 0; i < 10; i++)
            crReturn(
    1, i);
        crFinish;
    }



    posted @ 2007-11-29 18:17 dennis 閱讀(1179) | 評(píng)論 (0)編輯 收藏

    1.起點(diǎn),經(jīng)典hello world:

    print("Hello World")

    這與大多數(shù)腳本語(yǔ)言沒什么兩樣,總體來說如果你對(duì)JavaScript、Ruby、Python之類有所學(xué)習(xí)的話,LUA還是相當(dāng)簡(jiǎn)單的

    2.函數(shù)定義,類似JS,用begin end代替大括號(hào):

    function fact (n)

        if n == 0 then

           return 1

        else

           return n * fact(n-1)

        end

    end


    function其實(shí)就是lambda算子.

    3.  8種基本類型:
    nilbooleannumberstringuserdatafunctionthreadtable

    boolean類型除了false和nil是false之外,其他都是true
    lua支持函數(shù)式編程,因此函數(shù)是一等公民,userdata用于存儲(chǔ)C語(yǔ)言的數(shù)據(jù),待深入。thread與多線程編程有關(guān)。table是lua的基本數(shù)據(jù)結(jié)構(gòu),是array和hash的綜合體,比較奇怪的是默認(rèn)索引從1開始,而不是通常的0。看例子:

    days = {"Sunday", "Monday", "Tuesday", "Wednesday",

                  "Thursday", "Friday", "Saturday"}

    w = {x=0, y=0, label="console"}


    4. lua與ruby一樣支持多重賦值和函數(shù)可以返回多個(gè)值,常見控制結(jié)構(gòu)沒有什么好說的。

    5.可變參數(shù),lua有很濃重的C味道,可變參數(shù)也與C一樣,用...表示:
    function g (a, b, ...) ... end

    也可以通過表來傳遞命名參數(shù):

    rename{old="temp.lua", new="temp1.lua"}


    6.局部變量的聲明 local i=0,僅在聲明的代碼塊內(nèi)有效。如果沒有聲明為local,將自動(dòng)成為全局變量,一個(gè)變量在賦值前是nil,通過將變量聲明為nil可以刪除該變量

    7.LUA是有尾遞歸優(yōu)化的,也提供了各種高階函數(shù)以及閉包等等特性。

    8.loadstring函數(shù),一般其他解釋語(yǔ)言中的eval函數(shù)相似,不過他是返回一個(gè)chunk(每個(gè)chunk都是匿名函數(shù))讓你執(zhí)行,比如

    f = loadstring("local a = 10; return a + 20")

    print(f())        --> 30

    也可以通過loadfile將整個(gè)文件載入作為chunk。

    9.require,用于加載文件,會(huì)搜索環(huán)境變量LUA_PATH設(shè)定的路徑,同時(shí)能判斷文件是否已經(jīng)加載來避免重復(fù)加載。比較奇特的是路徑的設(shè)置,與一般的路徑完全不同,其實(shí)就是用?當(dāng)占位符,然后require filename的時(shí)候,用filename代替這些文號(hào),比如:

    ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua

    當(dāng)你require 'lili'的時(shí)候,就會(huì)尋找下列路徑的文件:

    lili

    lili.lua

    c:\windows\lili

    /usr/local/lua/lili/lili.lua


    10.lua通過loadlib函數(shù)可以加載動(dòng)態(tài)鏈接庫(kù)

    11.pcall在保護(hù)模式(protected mode)下執(zhí)行函數(shù)內(nèi)容,同時(shí)捕獲所有的異常和錯(cuò)誤。若一切正常,pcall返回true以及“被執(zhí)行函數(shù)”的返回值;否則返回nil和錯(cuò)誤信息。

    12.

    posted @ 2007-11-29 16:05 dennis 閱讀(2565) | 評(píng)論 (0)編輯 收藏

        客戶要求從Internet上的網(wǎng)頁(yè)上抽取一定的數(shù)據(jù),用來顯示或者其他用戶,這個(gè)需求很常見。這兩天我們也遇到了這個(gè)需求,本來我一開始想是試用正則表達(dá)式去匹配需要的文本數(shù)據(jù),后來經(jīng)驗(yàn)豐富的經(jīng)理給出了一個(gè)更好的思路,就是使用jtidy將不符合xhtml的HTML文件轉(zhuǎn)化成標(biāo)準(zhǔn)的xhtml文件——本質(zhì)上就是XML文件,然后利用xsl抽取并轉(zhuǎn)換成我們所需要的數(shù)據(jù)的一定格式的xml文件。這樣做其實(shí)就是將XSL模板當(dāng)正則表達(dá)式來用,不過更清晰,當(dāng)網(wǎng)頁(yè)改變時(shí)也不需要重新編譯代碼,僅僅修改XSL模板就夠了。過程如下:
         html->xhtml--xsl-->數(shù)據(jù)xml

        做的過程中,初次使用了xsl,xpath等技術(shù),網(wǎng)上找了不少好資料,共享下:
    jtidy: 

    思路來源
    http://www.ibm.com/developerworks/cn/xml/x-wbdm/

    項(xiàng)目地址
    http://jtidy.sourceforge.net/

    參考,解決中文問題使用
    http://www.tkk7.com/jhengfei/archive/2006/03/25/37312.html

    xsl,非常系統(tǒng)教程和實(shí)踐:

    http://www.cnblogs.com/goody9807/category/36016.html

    xpath:

    http://www.yesky.com/201/171201.shtml


    posted @ 2007-11-22 12:35 dennis 閱讀(1157) | 評(píng)論 (1)編輯 收藏

        《人工智能的未來》的作者是Jeff Hawkins,也就是著名的PalmPilot掌上電腦和Treo智能電話的發(fā)明人,這牛人從小就對(duì)人工智能充滿興趣并孜孜追求,哪怕從事軟件業(yè)也是為了自己的理想。就書的內(nèi)容來說,很有意思。作者先批判了傳統(tǒng)的人工智能的發(fā)展方向,并且斷定傳統(tǒng)的人工智能永遠(yuǎn)沒辦法造出能夠與人腦相媲美的智能機(jī)器。因?yàn)橄胍嬲亓私庵悄苁鞘裁矗挥腥パ芯咳四X的智能,而不能單純地依靠程序和數(shù)學(xué)。
        接下來,Jeff Hawkins系統(tǒng)地探討了自己對(duì)于新大腦皮層的理論,也就是他所宣稱的智能理論。所謂智能,其實(shí)就是新大腦皮層基于記憶-預(yù)測(cè)系統(tǒng)的系統(tǒng)體系。新大腦皮層由層次性的神經(jīng)元組成,由人類在成長(zhǎng)生活過程中不斷記憶強(qiáng)化的各種“恒定表征”,以及由此對(duì)輸入產(chǎn)生從上而下的預(yù)測(cè)。這樣說太抽象,舉個(gè)例子,你看著某個(gè)人的眼睛,這些信息通過你的眼睛感官上傳到大腦皮層,由下而上,細(xì)節(jié)構(gòu)成整體,過去的記憶形成的關(guān)于|“眼睛”的模式讓你知道你看到的是眼睛。這個(gè)過程不是單向的,同時(shí),你的大腦皮層作出預(yù)測(cè),“哦,往下看我應(yīng)該可以看到這個(gè)人的鼻子,往上看應(yīng)該是額頭”這樣的預(yù)測(cè)從上往下傳遞,并且配合你的感官器官得以驗(yàn)證。所謂智能就是這樣一個(gè)不斷驗(yàn)證記憶中的“模式”(或者稱為“恒定表征|”)不斷作出預(yù)測(cè)的過程。
        那么,什么是意識(shí)呢?意識(shí)包括兩種:自我意識(shí)和可感知的意識(shí)。我們通常所說的意識(shí)其實(shí)都是指自我意識(shí),這種“意識(shí)”本質(zhì)上也是基于記憶-預(yù)測(cè)模型的陳述性記憶。例如,昨天你去郊外參加野營(yíng),假設(shè)我有這么一種方法可以抹去你某一段時(shí)間的記憶,那么當(dāng)你今天早上醒來之前,我運(yùn)用這個(gè)方法抹去你昨天去野營(yíng)的記憶。今天,昨天與你去野營(yíng)的人說,“HI,昨天我們一起去野營(yíng)了”,可是你已經(jīng)沒有這段記憶,你會(huì)很驚訝并且辯解說自己根本沒有去,別人后來拿出了一起去野營(yíng)的錄象,你看了之后也許就說“啊,那時(shí)候我是沒有意識(shí)的,我像個(gè)僵尸,我真的去了嗎?”,可見,所謂自我意識(shí)就是陳述性的記憶。可感知的意識(shí),比如我們通常認(rèn)為藍(lán)色代表憂郁,紅色表示憤怒,這樣的意識(shí)與古腦有關(guān)(古腦控制了人類的基本情緒和感受,性欲、饑餓、高興等等),作者沒有給出確切的解釋,不過顯然也與記憶-預(yù)測(cè)模型相關(guān),我猜測(cè)這與人類長(zhǎng)期進(jìn)化形成的“記憶”有關(guān)。
        那么,什么是創(chuàng)造力?創(chuàng)造力在某些人眼里是那么的神奇,其實(shí)所謂創(chuàng)造力,仍然是構(gòu)建在記憶-預(yù)測(cè)的模型基礎(chǔ)上。我們俗語(yǔ)說“一通百通”,其實(shí)就是創(chuàng)造力的一種體現(xiàn),精通一樣技藝之后,在你的新大腦皮層已經(jīng)穩(wěn)定地形成了關(guān)于這項(xiàng)技藝的方方面面的“模式”,當(dāng)遇到另一樣需要學(xué)習(xí)的技藝時(shí),專家們總可以找到兩者間的共同點(diǎn)。比如在編程領(lǐng)域,設(shè)計(jì)模式就是關(guān)于軟件的高級(jí)抽象模式,這樣的模式可以應(yīng)用于各式各樣的語(yǔ)言。天才們的共同特點(diǎn)就是比一般人更能去發(fā)現(xiàn)抽象之抽象、模式之模式。因此,創(chuàng)造力完全是可以培養(yǎng)的,盡管由于個(gè)體上的差異(大腦的構(gòu)造和大腦皮層的面積以及環(huán)境、信仰等等),但是每個(gè)人其實(shí)都可以去培養(yǎng)自己的創(chuàng)造力。遇到難題,首先不能放棄,很多人其實(shí)沒有開始就放棄了,其次,應(yīng)該從不同角度去考慮問題,應(yīng)用不同感官和視角,這樣可以激發(fā)起你對(duì)相似場(chǎng)景的模式記憶,類比而去解決問題。在科學(xué)史上通過類比而創(chuàng)新的例子舉不勝舉。
        最后,什么是想象?新大腦皮層對(duì)輸入的信息與長(zhǎng)期訓(xùn)練形成的“恒定表征”相驗(yàn)證,同時(shí)不斷地去預(yù)測(cè),預(yù)測(cè)從皮層較高層次往下傳遞。如果將預(yù)測(cè)的傳輸方向倒轉(zhuǎn),也就是將預(yù)測(cè)作為輸入,顯然,這就是想象。想象其實(shí)就是策劃,不斷對(duì)行為產(chǎn)生的后果進(jìn)行預(yù)測(cè)。心理暗示的作用也從這個(gè)意義上得到了驗(yàn)證。
        說說所謂“恒定表征”,這個(gè)概念其實(shí)類似于柏拉圖哲學(xué)中的“理型”。我們?cè)趺粗酪恢粍?dòng)物是馬,而不是別的什么東西。按照柏拉圖的說法,這就是我們將感官中看到的馬,與心靈中“理型”的馬進(jìn)行類比而得出這是一只馬的結(jié)論,“完美理型的馬”擁有馬的一切特征,是具體馬的“形式”。而且柏拉圖認(rèn)為,“理型”是與生俱來的,來源于一個(gè)稱為“理型的世界”。Jeff Hawkins所說的“恒定表征”與此類似,不過“恒定表征”并不是生來就有的,而是人在成長(zhǎng)過程中不斷記憶學(xué)習(xí)形成的穩(wěn)定“模式”。還是以馬為例,第一次看見這種動(dòng)物,你并不知道這就是所謂馬,然后有人告訴你這就是馬,你記下了馬的特征和場(chǎng)景,在以后的生活里這個(gè)記憶被不斷地重復(fù)和強(qiáng)化,進(jìn)而形成了關(guān)于馬的“恒定表征”:馬是四條腿的動(dòng)物,如果不是的話,你也可以通過其他特征斷定這可能是受傷了只剩三條腿的馬;并且一般王子和大俠們也都喜歡騎白馬......

        基于這套新的智能框架,Jeff Hawkins認(rèn)為我們可以制造出真正的智能機(jī)器,而且這個(gè)領(lǐng)域也將成為下一個(gè)技術(shù)革命。制造出的智能機(jī)器不一定有人的表面特征,也就是機(jī)器人管家這樣的幻想中的東西并不是智能機(jī)器的方向,智能機(jī)器將充分利用速度和記憶容量上的優(yōu)勢(shì),在特定領(lǐng)域發(fā)揮驚人的作用,比如思考數(shù)學(xué)上的多維空間、天氣預(yù)報(bào)等等。這本書可以讓你一口氣讀完,翻譯得也相當(dāng)棒,相當(dāng)?shù)赝扑]。

    posted @ 2007-11-18 22:22 dennis 閱讀(655) | 評(píng)論 (0)編輯 收藏

        搬家到了福州,電視沒搬上來,住的又是郊區(qū),晚上空余的時(shí)間大增,讀書時(shí)間由過去的一兩個(gè)小時(shí)增長(zhǎng)到整個(gè)晚上。請(qǐng)還在讀研的兄弟幫忙在學(xué)校借了7本書,除了本《人工智能的未來》(這本挺有趣的),其他都是技術(shù)類,也知道自己的讀書面現(xiàn)在太窄了,不是不想看閑書,可確實(shí)有很多東西計(jì)劃著要去學(xué),如果還停留在計(jì)劃,我懷疑自己到底還會(huì)不會(huì)去讀,比如龍書和unix shell編程。談一下最近讀的很有感覺的兩本書。
        首先是〈網(wǎng)站重構(gòu)〉,這真的是我第一次認(rèn)真地去看一本web設(shè)計(jì)類的書。盡管一直是做WEB方面的開發(fā),但是對(duì)于網(wǎng)頁(yè)的設(shè)計(jì)和布局我從來沒有系統(tǒng)地學(xué)習(xí)過,當(dāng)然更不清楚為什么這樣做以及這樣做到底好不好。因?yàn)樽龅乃^企業(yè)應(yīng)用(可以指定用戶使用的瀏覽器版本),對(duì)于web標(biāo)準(zhǔn)我從來就沒有認(rèn)真關(guān)注過,也就在讀js高級(jí)程序設(shè)計(jì)時(shí)了解了js在各種瀏覽器上的基本差異。如果你跟我一樣,我強(qiáng)烈建議你看看〈網(wǎng)站重構(gòu)〉,從書中我才知道自己寫的網(wǎng)頁(yè)代碼是如此惡心,充斥著占用帶寬的垃圾代碼,沒有考慮可用性和維護(hù),更不用說麻煩的瀏覽器兼容問題。這還不是關(guān)鍵的,更關(guān)鍵的是這本書讓你回到了HTML和XHTML被設(shè)計(jì)出來的本意:他們是用來表示網(wǎng)站結(jié)構(gòu)的,而應(yīng)該將元素的展現(xiàn)交給CSS。將結(jié)構(gòu)和展現(xiàn)分離帶來了代碼量減少,帶來了維護(hù)的便利,也帶來了優(yōu)秀的瀏覽器兼容效果。
        另外一本讓我熬夜讀的就是鼎鼎大名的龍書 ,跟國(guó)產(chǎn)的一本正經(jīng)的教科書不同,這本書沒有一大堆羅列的公式和術(shù)語(yǔ),在第一章簡(jiǎn)單地對(duì)編譯器介紹后,第二章立馬用C語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)單而又完整的編譯器前端(將中綴算術(shù)表達(dá)式轉(zhuǎn)化成后綴表達(dá)式),又介紹了抽象的基于棧的機(jī)器實(shí)現(xiàn)算術(shù)運(yùn)算和條件循環(huán)表達(dá)式的基本原理。一口氣讀完前兩章,你得承認(rèn),計(jì)算機(jī)類的書還是國(guó)外的好。讀的時(shí)候我想起我過去用JAVA寫的一個(gè)簡(jiǎn)單的邏輯表達(dá)式解析器,雖然簡(jiǎn)陋,但是也暗合書中這個(gè)前端的原理,沒有系統(tǒng)學(xué)習(xí)過,寫出來的也是野路子,有需要的話再改寫一下。
       最后是工作,不是很順利,沒有我想像中的那么好,畢竟理想和現(xiàn)實(shí)是差距是永恒存在滴。開始一段時(shí)間挺不開心的,畢竟陌生的人和事總會(huì)讓你有點(diǎn)找不著北。我想我會(huì)適應(yīng)的,穩(wěn)定下情緒,慢慢進(jìn)入角色,做好本分就是了。   

    posted @ 2007-11-17 21:19 dennis 閱讀(561) | 評(píng)論 (2)編輯 收藏

        這兩天看了一本老書《bitter java》,第一次系統(tǒng)地了解了所謂“反模式”。就書的內(nèi)容來說已經(jīng)過于陳舊,書中提到的magic servlet、復(fù)合jsp等等反模式已經(jīng)是早就熟知的編程禁忌,而如web頁(yè)面不能有太多元素這樣的反模式也因?yàn)閍jax的出現(xiàn)(異步加載)變的不是那么“反模式”了,其中又講述了很多ejb的反模式,這些在輕量級(jí)框架流行的今天也早已經(jīng)過時(shí)。不過書中有一個(gè)章節(jié)倒是挺有價(jià)值,講述的是java的內(nèi)存泄露問題,我認(rèn)為是我目前讀的關(guān)于這方面問題比較有價(jià)值的介紹。
        網(wǎng)上關(guān)于java內(nèi)存泄露的資料都過于玄乎,其實(shí)java導(dǎo)致內(nèi)存泄露的原因很明確:長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L(zhǎng)生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場(chǎng)景。作者在書中提到了3個(gè)場(chǎng)景:
    1。流失監(jiān)聽器問題,在awt、swing編程中,給組件添加了事件監(jiān)聽器,這些組件的生命周期如果很長(zhǎng)的話,監(jiān)聽器對(duì)象將不能被正確回收。關(guān)于GUI編程我不是很熟悉,這一點(diǎn)存有疑問,因?yàn)轱@然你觸發(fā)一個(gè)按鈕的事件,當(dāng)然是一直期待同樣的行為發(fā)生,如果刪除了監(jiān)聽器或者使用弱引用讓JVM回收不符合業(yè)務(wù)邏輯和用戶體驗(yàn)。

    2。集合類,集合類僅僅有添加元素的方法,而沒有相應(yīng)的刪除機(jī)制,導(dǎo)致內(nèi)存被占用。這一點(diǎn)其實(shí)也不明確,這個(gè)集合類如果僅僅是局部變量,根本不會(huì)造成內(nèi)存泄露,在方法棧退出后就沒有引用了會(huì)被jvm正常回收。而如果這個(gè)集合類是全局性的變量(比如類中的靜態(tài)屬性,全局性的map等),那么沒有相應(yīng)的刪除機(jī)制,很可能導(dǎo)致集合所占用的內(nèi)存只增不減,因此提供這樣的刪除機(jī)制或者定期清除策略非常必要。

    3。單例模式。不正確使用單例模式是引起內(nèi)存泄露的一個(gè)常見問題,單例對(duì)象在被初始化后將在JVM的整個(gè)生命周期中存在(以靜態(tài)變量的方式),如果單例對(duì)象持有外部對(duì)象的引用,那么這個(gè)外部對(duì)象將不能被jvm正常回收,導(dǎo)致內(nèi)存泄露,考慮下面的例子:
    class A{
        public A(){
               B.getInstance().setA(this);
       }
       ....
    }
    //B類采用單例模式
    class B{
         private A a;
         private static B instance=new B();
         public B(){}
         public static B getInstance(){
             return instance;
        }
        public void setA(A a){
              this.a=a;
        }
       //getter...
    }

    顯然B采用singleton模式,他持有一個(gè)A對(duì)象的引用,而這個(gè)A類的對(duì)象將不能被回收。想象下如果A是個(gè)比較大的對(duì)象或者集合類型會(huì)發(fā)生什么情況。

        上面所講的這些也啟發(fā)我們?nèi)绾稳ゲ檎覂?nèi)存泄露問題,第一選擇當(dāng)然是利用工具,比如jprofiler,第二就是在代碼復(fù)審的時(shí)候關(guān)注長(zhǎng)生命周期對(duì)象:全局性的集合、單例模式的使用、類的static變量等等。

    posted @ 2007-11-11 20:18 dennis 閱讀(2894) | 評(píng)論 (4)編輯 收藏

        在Ruby中,無(wú)論類或者對(duì)象,都有一個(gè)singlton類(或者稱為metaclass),有興趣的話讀讀過去寫的這篇《Ruby的對(duì)象模型》。當(dāng)我們獲取某個(gè)類或者對(duì)象的class屬性時(shí),其實(shí)會(huì)忽略c ruby層次上的singleton類,那么我們?nèi)绾蔚玫絪ingleton類呢?比較有趣的做法:
    singletonclass=class<<Test;self;end

    對(duì)于對(duì)象,也是如此:
    test=Test.new
    metaclass=class<<test;self;end


    posted @ 2007-10-31 11:33 dennis 閱讀(341) | 評(píng)論 (0)編輯 收藏

        9月20號(hào)提的離職,按公司的要求,我也呆到了10月底,本來以為可以順利離職,可中途公司又提出想調(diào)我去武漢的新項(xiàng)目組。按我的想法,還是想在省內(nèi)再找家好點(diǎn)的公司鍛煉兩年,經(jīng)過更多的項(xiàng)目錘煉,然后去北京、上海或者廣州等地追尋新的夢(mèng)想,因此拒絕了公司的提議。前天公司又額外生枝,要求我呆在11月5號(hào),可我的離職明明寫的是31號(hào),公司有什么道理要求我呆到5號(hào)呢?自認(rèn)為對(duì)工作也是盡職盡責(zé)了,為了交接工作的順利進(jìn)行,我還特意加班讓接手工作的同事多點(diǎn)時(shí)間熟悉,我認(rèn)為自己盡到了責(zé)任,因此向公司領(lǐng)導(dǎo)說明了我會(huì)在明天就離開公司。最后終于還是成了,明天先回家,然后去福州,新的工作已經(jīng)找好,托了同學(xué)幫忙找房子,事情向好的一面發(fā)展,心情也好了不少。因?yàn)閾Q工作帶來的煩惱慢慢消逝,對(duì)未來還是充滿信心。

    posted @ 2007-10-31 10:46 dennis 閱讀(664) | 評(píng)論 (5)編輯 收藏

         摘要: 在未來,我們可能需要的是一個(gè)個(gè)高效精干的小型團(tuán)隊(duì),團(tuán)隊(duì)成員技藝高超,富于激情,易于溝通。  閱讀全文

    posted @ 2007-10-25 10:11 dennis 閱讀(1172) | 評(píng)論 (4)編輯 收藏

    僅列出標(biāo)題
    共56頁(yè): First 上一頁(yè) 31 32 33 34 35 36 37 38 39 下一頁(yè) Last 
    主站蜘蛛池模板: 毛茸茸bbw亚洲人| 中文字幕av无码不卡免费| 亚洲国产另类久久久精品黑人 | 又粗又大又猛又爽免费视频| 95老司机免费福利| a毛片全部播放免费视频完整18| 亚洲欧美在线x视频| 亚洲午夜成人精品无码色欲| 亚洲一区二区三区日本久久九| 亚洲色欲久久久久综合网| 国产精品久免费的黄网站| 无码国产精品一区二区免费式直播 | 亚洲av片在线观看| 自拍日韩亚洲一区在线| 亚洲视频免费观看| 亚洲伊人tv综合网色| 亚洲爆乳无码专区| 亚洲人成网77777色在线播放| 亚洲欧洲日产国码一级毛片 | 深夜a级毛片免费无码| 亚洲欧美成aⅴ人在线观看| 亚洲人成电影青青在线播放| 日韩亚洲Av人人夜夜澡人人爽 | 免费观看成人久久网免费观看| 乱人伦中文视频在线观看免费| 亚洲av无码专区国产不乱码| 亚洲精品又粗又大又爽A片| 亚洲人成综合网站7777香蕉| 激情综合亚洲色婷婷五月| 亚洲精品免费在线视频| 亚洲天堂中文字幕在线观看| 91情国产l精品国产亚洲区| 亚洲黄色在线播放| 亚洲成aⅴ人片在线影院八| 亚洲最新中文字幕| 亚洲人成影院在线高清| jiz zz在亚洲| 亚洲国产精品99久久久久久| 国产成人 亚洲欧洲| 一区二区三区视频免费| 国产综合免费精品久久久|