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

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

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

    sinoly

       :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      29 隨筆 :: 76 文章 :: 189 評(píng)論 :: 0 Trackbacks

    ???????2007年以來(lái),從GeotoolsPostGISJTS Topology Suite再到java優(yōu)化編程感受,看似過(guò)程相當(dāng)?shù)膹?fù)雜,而且相當(dāng)?shù)牧鑱y。呵呵,都是Geotools惹的禍呀,沒(méi)有辦法,為了能深度使用Geotools我只能研究JTS Topology Suite,在學(xué)習(xí)JTS過(guò)程中又有一些感想,呵呵,其實(shí)從目的而言跨度沒(méi)有那么大,只是一個(gè)磨刀不誤砍柴功的過(guò)程。?????

    ?????? 讀了一些JTS的源碼,呵呵,不對(duì)不是一些,而只是com.vividsolutions.jts.geom中的一部分那,還不到整個(gè)JTS Topology Suite源碼的1/10的代碼,對(duì)其實(shí)現(xiàn)思路可能還不是很清晰,但是看著大拿們寫(xiě)的代碼還是讓我覺(jué)得很有收獲。這些收獲有我以前沒(méi)有感受的,也有以前知道原理但是就是不去重視的內(nèi)容。寫(xiě)在這些文字當(dāng)作是對(duì)自己編程風(fēng)格的一篇械文。也希望在學(xué)習(xí)JTS的過(guò)程中能從大拿們的代碼中學(xué)習(xí)到更多的內(nèi)容,最終使得自己不僅僅學(xué)習(xí)這些編程大拿成果的使用,更使自己能提高自己的代碼質(zhì)量。

    ????? 作為自己對(duì)Java優(yōu)化編程感受的開(kāi)篇,還是從最基礎(chǔ)的GC開(kāi)始吧。呵呵,畢竟GC的存在是Java的特色之一,但是如果完全依托于JVM中的GC就想獲取良好的程序效率太困難了,這一點(diǎn)相信很多人都有一個(gè)清楚的認(rèn)識(shí)。如何合理的使用Java回收機(jī)制,如何讓GC更快的實(shí)施回收,我想也許很多程序員和我一樣都不是很重視,所以先來(lái)拋個(gè)磚,讓朋友們一起來(lái)批判一下。

    ???? (一下文字中有一些引用了曾經(jīng)看過(guò)的《JVM初探》、《Java的GC機(jī)制》等牛人文章,由于時(shí)間太長(zhǎng),很多定義我無(wú)法記住來(lái)源,所以就不一一標(biāo)明了。望原作者諒解!ps:標(biāo)題貌似是這個(gè))

    ???? Java程序中的內(nèi)存管理機(jī)制是通過(guò)GC完成的,“一個(gè)對(duì)象創(chuàng)建后被放置在JVM的堆內(nèi)存中,當(dāng)永遠(yuǎn)不在應(yīng)用這個(gè)對(duì)象的時(shí)候?qū)?huì)被JVM在堆內(nèi)存中回收。被創(chuàng)建的對(duì)象不能再生,同時(shí)也沒(méi)有辦法通過(guò)程序語(yǔ)句釋放”(這個(gè)是《Java的GC機(jī)制》中提到的定義,呵呵,還依稀記得)這就是GC對(duì)垃圾對(duì)象的定義。個(gè)人感覺(jué)這么解釋或許會(huì)比較快理解:在運(yùn)行環(huán)境中JVM會(huì)對(duì)兩種內(nèi)存進(jìn)行管理,一種是堆內(nèi)存(對(duì)象實(shí)例或者變量),一種是棧內(nèi)存(靜態(tài)或非靜態(tài)方法),而JVM所管理的內(nèi)存區(qū)域?qū)嶋H上就是堆內(nèi)存+棧內(nèi)存(MS:對(duì)象實(shí)例+實(shí)例化變量+靜態(tài)方法+非靜態(tài)方法),當(dāng)JVM在其所管理的內(nèi)存區(qū)域的中無(wú)法通過(guò)根集合到達(dá)對(duì)象的時(shí)候就會(huì)將此對(duì)象作為垃圾對(duì)象實(shí)施回收。

    ????? Java所有的對(duì)象都有一個(gè)生命周期:創(chuàng)建、使用、不可視、不可到達(dá)、回收釋放。先就從這個(gè)過(guò)程中結(jié)合昨天(2月9日)10點(diǎn)到今天(2月10日)凌晨2點(diǎn)看JTS代碼的一些感受,對(duì)自己來(lái)個(gè)自我批評(píng)吧,同時(shí)也對(duì)自己的一些經(jīng)驗(yàn)做一次總結(jié)(呵呵,在老爸家,無(wú)法上網(wǎng),都不知道什么時(shí)候可以帖到Blog去)

    • 創(chuàng)建階段

    ??????????先來(lái)看看我從JTS代碼中感受到我需要立刻改正的錯(cuò)誤,雖說(shuō)理論上我明白道理,但是我就是沒(méi)有去做過(guò),也許這就是大師和大師兄的區(qū)別吧。。。汗自己一個(gè)。。。

    ????????? 我的代碼中曾經(jīng)出現(xiàn)過(guò)這樣的代碼:

    ????????? List alist=uSvr.getUserinfoList();

    ????????? for(int i=0;i<alist.size();i++){

    ???????????? //首先這里就有問(wèn)題,這個(gè)是Crespo小兄弟給我提出的。最好使用for(int i=0 p=alist.size();i<p;i++),避免alist由于在循環(huán)體中發(fā)生變化時(shí)所帶來(lái)的問(wèn)題,而且即便alist沒(méi)有發(fā)生變化,這么做也避免程序不斷去執(zhí)行size()方法所帶來(lái)的資源損耗。贊一個(gè)先,因?yàn)?a href="/crespo9907/" target="_blank">Crespo所提到的思路在JTS代碼中大師們都這么干,而且也絕對(duì)應(yīng)該這么干

    ????????????? Object obj=new Object();

    ????????????? //這里問(wèn)題大了。創(chuàng)建對(duì)象第一忌:不要在循環(huán)體中創(chuàng)建對(duì)象。這種做法會(huì)在內(nèi)存中保存N份這個(gè)對(duì)象的引用//會(huì)浪費(fèi)大量的內(nèi)存空間(雖說(shuō)內(nèi)存便宜,可以進(jìn)行硬件升級(jí)),同時(shí)JVM的GC機(jī)制會(huì)因?yàn)檫@些無(wú)謂的對(duì)象做大量//的回收工作,系統(tǒng)不慢都不行呀。。。好在這個(gè)問(wèn)題很早以前就被我注意了,現(xiàn)在我的做法時(shí)在循環(huán)體外首先聲明一個(gè)空對(duì)象,然后在循環(huán)體內(nèi)new一個(gè)出來(lái)。

    ????????????? 。。。 。。。?

    ???????? }

    ????????現(xiàn)在我寫(xiě)的代碼中出現(xiàn)這種情況

    ??????? public class Test{

    ?????????? Object obj=new Object();

    ?????????? public Test(){

    ????????????? obj=new Object();

    ???????????? //我的代碼將Object對(duì)象初始化了兩次。這個(gè)給內(nèi)存帶去的消耗絕對(duì)不比在循環(huán)體中創(chuàng)建對(duì)象來(lái)得小。創(chuàng)建對(duì)象第二忌:盡可能不要多次初始化對(duì)象。我這個(gè)問(wèn)題也是恰好這兩天在給一個(gè)公司做一個(gè)SP數(shù)據(jù)轉(zhuǎn)發(fā)的開(kāi)發(fā)中寫(xiě)過(guò)的。看JTS的大師們的代碼在想流程的時(shí)候,偶然發(fā)現(xiàn)這個(gè)問(wèn)題,但是那個(gè)汗呀。。真的。。汗流成河。。。

    ????????? }

    ?????? }

    ?????? 除了上面兩大忌諱外,對(duì)象在創(chuàng)建過(guò)程中還需要注意到以下問(wèn)題。不采用過(guò)深的集成關(guān)系;訪問(wèn)本地變量由于訪問(wèn)類(lèi)變量。這兩點(diǎn)很多書(shū)都有提到。

    • 使用階段

    ?????? 其實(shí)對(duì)象在使用階段的優(yōu)化,JTS的源碼給我了一種提示,那就是java.lang.ref的有效利用。這個(gè)包實(shí)際上我今天是第一次看,從來(lái)都沒(méi)有注意過(guò)這個(gè)包的使用問(wèn)題,雖說(shuō)它屬于java.lang核心開(kāi)發(fā)API中的范疇。知道看到JTS源碼中出現(xiàn)這個(gè)代碼我才“帶著這玩意干什么的?”的疑問(wèn)翻了一下API

    ?????? 結(jié)合JTS源碼中的寫(xiě)法以及所查閱的API的內(nèi)容,說(shuō)說(shuō)我的感受吧。首先在java.lang.ref包中最值得我們多關(guān)注的是如何合理的使用SoftReference以及WeakReference。也就是我么那如何將我們的對(duì)象置為軟引用和弱引用。在API上有軟引用以及弱引用的詳細(xì)解析,俺就不JY了,哪些人更不得了,都是火星派來(lái)介紹地球什么叫Java的外星人。很是先看看JTS代碼中大師們的程序風(fēng)格吧:

    ?

    ????Object?obj = new ?Object();

    ?????使用obj對(duì)象過(guò)程

    ????SoftReference?softReference
    = new ?SoftReference(obj); // 將obj設(shè)置為軟引用類(lèi)型

    ????obj
    = null ; // 強(qiáng)制釋放引用

    ????
    // obj對(duì)象再次使用時(shí)應(yīng)該做的處理

    ????
    if (softReference != null ) {

    ????????obj
    = softReference.get();

    ?????}
    else {

    ???????obj
    = new ?Object();

    ????}

    ?

    ??????? 老實(shí)話,第一眼看到這樣的代碼我很驚訝,這tmd不是無(wú)聊嗎?用了obj對(duì)象就直接仍到SoftReference(哪時(shí)候還以為是JTS自己的一種緩存機(jī)制)不說(shuō)還要強(qiáng)制釋放,第二次引用要么用get方法取,要么重新初始化,這不是沒(méi)事找事情嗎?唉,真是差距呀。。。OutOfMemory錯(cuò)誤我一直都不在意,認(rèn)為那是硬件問(wèn)題,我不管。可是看看大師們,為了更加有效的節(jié)約資源所作的工作吧,這些東西增加了少量的程序工作量,可是對(duì)于系統(tǒng)資源使用效率以及程序執(zhí)行效率的提升確實(shí)是很大的首先將對(duì)象設(shè)置為軟引用,然后強(qiáng)制釋放,將資源流出來(lái)給其他對(duì)象,當(dāng)程序需要在此使用這對(duì)象得時(shí)候要么從softReference(其實(shí)也可以看作是簡(jiǎn)單緩存)中將原有對(duì)象還原,要么由于被GC回收了軟引用,再重新初始化一次。。。。(所以說(shuō)研究出Java的人都是火星上來(lái)的,居然考慮得如此周密)

    ???? 弱引用方法河軟引用方法一樣。他們之間得區(qū)別在于弱應(yīng)用能更快得被GC給回收,畢竟軟應(yīng)用只是再內(nèi)存使用到達(dá)警戒水平的時(shí)候才會(huì)進(jìn)行。結(jié)合JTS目標(biāo)是處理空間數(shù)據(jù)以及空間拓?fù)洌幚淼膶?duì)象很多都是一種Map結(jié)構(gòu)的對(duì)象,這種對(duì)象會(huì)占用大量的內(nèi)存空間,所以我們很好理解JTS為什么做了這么多我們平時(shí)再代碼中從來(lái)不注意的事情。但是這不代表因?yàn)槲覀兊南到y(tǒng)目標(biāo)和JTS不一樣,所以我們就可以不去做這些工作。

    • 不可視階段

    ????????? 什么樣的對(duì)象可以將其認(rèn)定為不可視階段呢?舉個(gè)例子吧,在try{...}catch(Exception){...}代碼中,如果在try的代碼塊中聲明了一個(gè)obj,那么當(dāng)整個(gè)?try{...}catch(Exception){...}代碼段執(zhí)行完畢以后這個(gè)obj實(shí)際上就已經(jīng)屬于不可視階段了。在JTS源碼中我看到很多這樣的例子,大師們會(huì)在try代碼塊的最后多一句話:obj=null;實(shí)際上這種方式我也使用過(guò),但是99%的時(shí)候都用所謂的項(xiàng)目時(shí)間緊張為借口忽略了。其實(shí)多這么一句話將obj對(duì)象置為空值可以快速的幫助JVM發(fā)現(xiàn)這個(gè)對(duì)象,并進(jìn)行回收以釋放資源。這里也有一部分代碼是使用的SoftReference來(lái)處理,呵呵,大師的風(fēng)格也不盡相同呀。

    ???????? 當(dāng)然,即便沒(méi)有這句話最終這個(gè)對(duì)象會(huì)被GC給回收,但是快速的釋放資源就可以有效的提高現(xiàn)有資源的利用效率,這個(gè)難道真的不應(yīng)該被我們這些使用高級(jí)編程語(yǔ)言進(jìn)行開(kāi)發(fā)的程序員所提倡嗎?資源永遠(yuǎn)都是有限的,并非只是匯編或是做嵌入式開(kāi)發(fā)的程序員才應(yīng)該關(guān)注程序使用資源的問(wèn)題的!改編周星星名言-“程序不是這樣寫(xiě)的!資源不是這么用的!”

    • 不可到達(dá)/回收釋放階段

    ??????????一個(gè)對(duì)象混到這份上就也該知足了,也該自覺(jué)一點(diǎn)輕輕走了算了,就算不走GC作為警察(戶籍警察)也會(huì)對(duì)此對(duì)象實(shí)施強(qiáng)制消戶了。。。一般情況下我還是不相信這個(gè)世界上有鬼存在的,那些怎么打也打不死的青銅圣斗士除外。。。。?

    ?

    ????? 其他方面據(jù)不完全統(tǒng)計(jì)的個(gè)人經(jīng)驗(yàn)而言,在開(kāi)發(fā)過(guò)程中做到1、不提前創(chuàng)建對(duì)象,什么時(shí)候用什么時(shí)候創(chuàng)建;2、數(shù)組創(chuàng)建時(shí)盡可能避免顯示申請(qǐng)數(shù)據(jù)的內(nèi)存空間;3、當(dāng)對(duì)象占用資源大&對(duì)象數(shù)據(jù)穩(wěn)定&對(duì)象生命周期長(zhǎng)可能的使用靜態(tài)變量;4、使用IDE編譯代碼的時(shí)候在程序的發(fā)布版本編譯時(shí)去掉IDE默認(rèn)的debug編譯模式(Eclipse:窗口-首選項(xiàng)-java-編譯器)、在需要同類(lèi)大量對(duì)象的時(shí)候,使用對(duì)象池,數(shù)據(jù)庫(kù)連接池即在次范圍。。。 。。。同時(shí)沒(méi)有事情的時(shí)候多多學(xué)習(xí)大師的代碼,java開(kāi)源社區(qū)有很多值得學(xué)習(xí)代碼風(fēng)格的源代碼等待著我們呢:)

    ?

    附上代碼來(lái)解釋一下堆內(nèi)存和棧內(nèi)存的區(qū)別

    (閱讀許可證:本實(shí)例代碼未滿18歲或家有女王者勿入,由本代碼引起的一切糾紛、人身傷害以及法律問(wèn)題需閱讀者自行解決,原創(chuàng)作者 sinoly 不承擔(dān)任何責(zé)任。一旦閱讀本代碼,就表示你已接受本許可所提出的所有觀點(diǎn))

    ?

    public ? class ?我的老婆們 {

    static ?Vector?老婆s = new ?Vector(); // 創(chuàng)建一個(gè)老婆的Vector序列

    static ? void ?娶個(gè)老婆() {??????

    ??????PLMM?plmm?
    = ? new ?PLMM(); // 請(qǐng)首先new一個(gè)PLMM對(duì)象

    ??????老婆?wife
    = (老婆)plmm?; // 不作此做出方法解釋?zhuān)婕暗教鄦?wèn)題

    ??????老婆s.AddElement(老婆);
    // 本方法多次運(yùn)行可實(shí)現(xiàn)了一夫多妻的宏偉目標(biāo),也是本人長(zhǎng)期努力的方向

    }


    public ? static ? void ?main(String[]?args) {

    ??????娶個(gè)老婆();
    // 執(zhí)行此方法可能會(huì)帶來(lái)內(nèi)存溢出,請(qǐng)慎重!

    }


    }

    ?

    棧內(nèi)存中存放的內(nèi)容:main,娶個(gè)老婆()

    堆內(nèi)存中存放的內(nèi)容:我的老婆們,我的老婆們.老婆s,Vector,plmm,老婆

    NOTE:堆內(nèi)存是在JVM啟動(dòng)的時(shí)候創(chuàng)建,堆內(nèi)存分為新對(duì)象與老對(duì)象。對(duì)于新對(duì)象好像會(huì)分三個(gè)區(qū)域。當(dāng)優(yōu)先級(jí)最高的區(qū)域的堆棧滿了以后JVM將會(huì)進(jìn)行測(cè)試,測(cè)試內(nèi)容是那些對(duì)象不可到達(dá),不可到達(dá)的對(duì)象將會(huì)放入到老對(duì)象區(qū)域。同時(shí)JVM會(huì)將所有對(duì)象拷貝到另外兩個(gè)區(qū)域中,然后經(jīng)過(guò)一段時(shí)間依然沒(méi)有引用的對(duì)象會(huì)進(jìn)入老對(duì)象區(qū)域。對(duì)于老對(duì)象區(qū)域而言基本上就是等待被GC回收的對(duì)象了。(這些還是在大學(xué)時(shí)學(xué).net時(shí)候的知識(shí),直接換成java定義我想其中概念應(yīng)該一樣。唉,大學(xué)畢業(yè)到現(xiàn)在快5年了--真的老了,唉!看著周?chē)?3年甚至85年的同事,真的很傷自尊呀!)

    ps:拜托各位看官千萬(wàn)不要把前一段代碼和這個(gè)NOTE結(jié)合起來(lái)聯(lián)想,會(huì)死人的!



    posted on 2007-02-11 03:02 sinoly 閱讀(3766) 評(píng)論(12)  編輯  收藏 所屬分類(lèi): 咸魚(yú)扯淡

    評(píng)論

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-02-12 03:25 sinoly
    呵呵,一正在和一老兄就優(yōu)化編程問(wèn)題爭(zhēng)論。特此聲明一把:我不確定我所寫(xiě)的文字里面有沒(méi)有什么錯(cuò)誤的觀點(diǎn)或者錯(cuò)誤的認(rèn)知,所以各位看了以后還是需要自己查一下資料。
    如果和哪老兄的爭(zhēng)論有了結(jié)果或者我發(fā)現(xiàn)我的文字里面的錯(cuò)誤的時(shí)候我最第一時(shí)間在此進(jìn)行修訂!  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-02-14 08:38 sniper
    看了挺有用的,改善自己的代碼  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-02-14 18:57 sinoly
    @sniper
    呵呵,很多只是自己的看法。。。確切性不祥。。。。  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-02-16 14:06 barry
    樓主很幽默。。。  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-15 16:20 一分錢(qián)換寶馬
    大哥,我想問(wèn)哈,在軟引用的時(shí)候,內(nèi)存快要溢出的時(shí)候,軟引用是不是要置為null啊?此時(shí)使用的對(duì)象是不是被引用對(duì)象(obj)是不是就會(huì)新建啊?@barry
      回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-15 16:20 一分錢(qián)換寶馬
    大哥,我想問(wèn)哈,在軟引用的時(shí)候,內(nèi)存快要溢出的時(shí)候,軟引用是不是要置為null啊?此時(shí)使用的被引用對(duì)象(obj)是不是就會(huì)新建啊?@barry
      回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-16 01:43 sinoly
    @一分錢(qián)換寶馬
    1、軟引用本身不需要釋放。需要釋放的是你申明為軟引用的obj對(duì)象。
    2、obj對(duì)象不是新建,而是從軟引用中恢復(fù)  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-16 09:15 一分錢(qián)換寶馬
    要么由于被GC回收了軟引用,再重新初始化一次。。。。(所以說(shuō)研究出Java的人都是火星上來(lái)的,居然考慮得如此周密)

    上面的這個(gè)意思不是說(shuō)回收軟引用,然后再重建obj對(duì)象嗎?
    不好意思再次打擾摟住哦!謝謝!  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-16 09:26 sinoly
    @一分錢(qián)換寶馬
    呵呵,這是一種情況,就是軟引用本身由于各種原因已被GC回收了,這個(gè)時(shí)候obj對(duì)象是需要重新初始化的。這個(gè)就和對(duì)象本身被回收,如要再次使用唯一的辦法就是重新初始化了

      回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一) 2007-03-16 10:01 一分錢(qián)換寶馬
    哦!1.還有一個(gè)問(wèn)題,如果obj對(duì)象的狀態(tài)不停的發(fā)生變化,從軟引用恢復(fù)的obj
    對(duì)象是最初的obj還是變化后的obj啊?
    2.我看到【java優(yōu)化編程】上有一個(gè)int[] intArray=obj.getIntAarry();
    我都不知道obj是什么類(lèi)型的對(duì)象。
    希望樓主賜教!謝謝!我的qq285843349,望加!
      回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一)[未登錄](méi) 2007-03-26 21:49 cyqian
    受教~~~  回復(fù)  更多評(píng)論
      

    # re: 看JTS源碼,感受Java優(yōu)化編程(一)[未登錄](méi) 2007-10-16 17:03 過(guò)客
    唉,看了半天,原來(lái)還是初級(jí)階段的文章。
    不要為了將要的性能問(wèn)題去破壞一個(gè)良好的設(shè)計(jì)。研究這個(gè)會(huì)陷入怪圈  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲av无码天堂一区二区三区| 日本a级片免费看| 毛茸茸bbw亚洲人| 久久亚洲精品成人777大小说| 亚洲精品综合久久中文字幕| 久久免费精品视频| 免费中文熟妇在线影片 | 亚洲美女aⅴ久久久91| 久久久久久久99精品免费| 亚洲AV无码1区2区久久| 四虎国产精品永久免费网址| 91情侣在线精品国产免费| 亚洲综合图色40p| 欧洲人成在线免费| 亚洲欧洲日产国码在线观看| 香港特级三A毛片免费观看| 亚洲国产aⅴ综合网| 免费精品久久天干天干| 精品亚洲A∨无码一区二区三区| 免费看一级一级人妻片| 国产亚洲精久久久久久无码AV| 亚洲人成色99999在线观看| 午夜无码A级毛片免费视频| 亚洲国产成人91精品| 久久国产乱子精品免费女| 亚洲国产美女精品久久久久| japanese色国产在线看免费| 成全影视免费观看大全二| 亚洲毛片无码专区亚洲乱| 日韩精品视频免费网址| 日韩精品无码免费专区午夜| 亚洲国产精品日韩在线观看| 国产91久久久久久久免费| 亚洲av色香蕉一区二区三区| 国产精品亚洲αv天堂无码| 91人人区免费区人人| 中文字幕亚洲一区二区三区| 1a级毛片免费观看| 亚洲高清一区二区三区电影| 99久久久精品免费观看国产 | 成人毛片免费观看|