JVM系列之(2)——垃圾回收算法和垃圾收集器

1狭吼、垃圾回收方法

標(biāo)記清除復(fù)制——浪費(fèi)一部分內(nèi)存,但是不需要移動(dòng)對(duì)象衬衬。適合新生代买猖,少量對(duì)象存活。


標(biāo)記清除整理——適合老年代(大部分對(duì)象存活滋尉,需要移動(dòng)的對(duì)象不多)玉控,并不會(huì)每次GC都做整理,具體垃圾收集器做設(shè)置狮惜。


2高诺、垃圾收集器


不同垃圾收集器的區(qū)分:

新生代、老年代垃圾收集器碾篡,

單線程虱而、多線程并行垃圾收集器,

stop the world和并發(fā)(GC線程和用戶線程同時(shí)運(yùn)行)的垃圾收集器

如果你運(yùn)行在JVM的客戶端模式(Client)下开泽,JVM默認(rèn)垃圾收集器是串行垃圾收集器(Serial GC牡拇,-XX:+USeSerialGC);在JVM服務(wù)器模式(Server)下默認(rèn)垃圾收集器是并行垃圾收集器(Parallel GC,-XX:+UseParallelGC)惠呼。

(1)导俘、serial、serial old收集器:

單線程剔蹋,不存在線程之間切換旅薄,適用于client模式。

Serial old會(huì)作為CMS收集器concurrent mode failure失敗時(shí)的替代收集器滩租。

(2)赋秀、ParNew收集器

ParNew收集器其實(shí)就是Serial收集器的多線程版本(也是一個(gè)新生代收集器),除了使用多條線程進(jìn)行垃圾收集外律想,其余行為都與Serial收集器完全一樣猎莲,共用了相當(dāng)多的代碼。

ParNew垃圾收集器作為CMS收集器的默認(rèn)新生代收集器技即,也可以通過-XX:UseParNewGC選項(xiàng)來強(qiáng)制指定著洼,使用-XX:ParallelGCThreads參數(shù)來限制垃圾收集的線程數(shù)。

(3)而叼、Parallel Scavenge

Parallel Scavenge也是新生代并行垃圾收集器身笤。和ParNew不同的是,Parallel Scavenge收集器的目標(biāo)是達(dá)到可控的吞吐量葵陵,吞吐量?jī)?yōu)先液荸,吞吐量=運(yùn)行用戶代碼時(shí)間 / (運(yùn)行用戶代碼時(shí)間 + 垃圾收集時(shí)間)。主要適合在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)脱篙。

-XX:MaxGCPauseMillis 控制最大垃圾收集停頓時(shí)間娇钱,允許的值是一個(gè)大于零的毫秒數(shù),收集器將盡可能地保證內(nèi)存回收花費(fèi)的時(shí)間不超過設(shè)定值(但是不是說這個(gè)值設(shè)置的越小绊困,垃圾收集的速度就越快文搂,垃圾收集停頓時(shí)間縮短是以犧牲吞吐量和新生代空間換取的:系統(tǒng)把新生代調(diào)小一些,收集300M新生代肯定比收集500M快秤朗,這也導(dǎo)致垃圾收集發(fā)生的更頻繁煤蹭,原來十秒收集一次、每次停頓一百毫秒取视,現(xiàn)在變成五秒收集一次硝皂、每次停頓七十毫秒,停頓時(shí)間的確下降了作谭,但是吞吐量也下降了)吧彪。

-XX:GCTimeRatio 直接設(shè)置吞吐量大小,參數(shù)的值應(yīng)當(dāng)是一個(gè)大于零小于一百的整數(shù)丢早,相當(dāng)于吞吐量的倒數(shù)姨裸。如果此參數(shù)值為19秧倾,那允許垃圾收集的時(shí)間就占總時(shí)間的5%(即1/(1+19)),默認(rèn)值是99

-XX:UseAdaptiveSizePolicy 這是一個(gè)開關(guān)參數(shù)傀缩。當(dāng)這個(gè)參數(shù)打開之后那先,就不需要手工指定其他參數(shù)等細(xì)節(jié)了,虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)控信息赡艰,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最何時(shí)的停頓時(shí)間或者最大的吞吐量售淡,這種調(diào)節(jié)方式稱為GC自適應(yīng)的調(diào)節(jié)策略(GC Ergonomics)。這是一個(gè)不錯(cuò)的選擇慷垮,只需要把基本的內(nèi)存數(shù)據(jù)設(shè)置好(如-Xmx設(shè)置最大堆)揖闸,然后使用MaxGCPauseMillis參數(shù)(更關(guān)注最大停頓時(shí)間)或GCTimeRatio(更關(guān)注吞吐量)參數(shù)給虛擬機(jī)設(shè)立一個(gè)優(yōu)化目標(biāo),具體細(xì)節(jié)就不用管了料身。

Parallel Old收集器

此收集器是Parallel Scavenge收集器的老年代版本汤纸,這個(gè)收集器出現(xiàn)之后,“吞吐量?jī)?yōu)先”收集器終于有了名副其實(shí)的應(yīng)用組合芹血。其運(yùn)行過程和Parallel Scavenge類似贮泞。

(4)、CMS收集器

此收集器用戶線程和GC線程可以并發(fā)進(jìn)行幔烛,是一種以獲得最短回收停頓時(shí)間為目標(biāo)的收集器啃擦。大量用在B/S系統(tǒng)的服務(wù)器上,因?yàn)檫@類應(yīng)用注重響應(yīng)速度饿悬,給用戶較好的體驗(yàn)令蛉。

-XX:+UseConcMarkSweepGC:激活CMS收集器,默認(rèn)情況下使用ParNew + CMS + Serial Old的收集器組合進(jìn)行內(nèi)存回收狡恬,Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗后的后備收集器使用言询。

初始標(biāo)記

CMS算法中兩個(gè)會(huì)觸發(fā)Stop the World事件中的一個(gè),這個(gè)階段會(huì)標(biāo)記所有與GC Roots直接相關(guān)聯(lián)的對(duì)象傲宜,以及被存活的青年代對(duì)象所直接引用的對(duì)象。

并發(fā)標(biāo)記

GC在運(yùn)行的過程中用戶的應(yīng)用線程并不會(huì)停止工作夫啊。該階段GC收集器會(huì)從第一步“初始標(biāo)記”中所標(biāo)記出來的對(duì)象開始逐步遍歷這些對(duì)象(與GCRoot直接相連或與存活的青年代對(duì)象直接相關(guān)聯(lián)的對(duì)象)的所引用的對(duì)象函卒,并將這些被引用的對(duì)象加上標(biāo)記。(需要注意的是撇眯,這一步中报嵌,會(huì)漏掉一下老年代的存活對(duì)象,這是因?yàn)樵诓l(fā)的過程中熊榛,用戶應(yīng)用線程可能會(huì)對(duì)老年代的對(duì)象產(chǎn)生引用上的改變锚国。某一些被改變的標(biāo)記可能會(huì)被遺漏。)

并發(fā)預(yù)清理

并發(fā)預(yù)清理是Java1.5被加入進(jìn)來的玄坦。主要目的是減少重標(biāo)記(Remark)步驟Stop-the-World的時(shí)間血筑。這一步同樣也是并發(fā)的绘沉,不會(huì)停止用戶應(yīng)用線程。在前面的并發(fā)標(biāo)記中豺总,一些引用被改變了车伞。當(dāng)某一塊塊(Card)中的對(duì)象引用發(fā)生改變時(shí),JVM會(huì)標(biāo)記這個(gè)空間為“臟塊”(Dirty Card)喻喳。

在預(yù)清理階段另玖,JVM根據(jù)之前記錄的這些“臟對(duì)象”重新標(biāo)記了他們新的可達(dá)對(duì)象。這一步結(jié)束后空間重新進(jìn)入clean狀態(tài)表伦。另外谦去,一些必要的最終重標(biāo)記之前的準(zhǔn)備步驟也會(huì)在這一步做好。

預(yù)清理步驟將會(huì)不斷重復(fù)一直到Eden區(qū)的占用量達(dá)到某個(gè)指定的閾值蹦哼。設(shè)定這個(gè)閾值作為結(jié)束條件的原因主要是為了防止YoungGC產(chǎn)生的Stop-the-World和下一階段的Remark同時(shí)產(chǎn)生鳄哭,導(dǎo)致系統(tǒng)產(chǎn)生一個(gè)更長(zhǎng)的停滯杀怠。設(shè)定了這個(gè)閾值之后基本可以保證Remark階段可以在兩次YoungGC之間進(jìn)行币厕。

重新標(biāo)記

這是CMS算法中第二個(gè)會(huì)觸發(fā)Stop-the-World事件的步驟稚叹,由于前一步是一個(gè)并發(fā)的步驟款筑,預(yù)清理的速度可能會(huì)趕不上用戶應(yīng)用對(duì)對(duì)象改變的速度疏橄,所以需要一個(gè)Stop-the-World的暫停來完整的標(biāo)記所有對(duì)象結(jié)束整個(gè)標(biāo)記階段渠脉。

通常CMS會(huì)在年輕代為空時(shí)來運(yùn)行重標(biāo)記階段汽绢,以此避免一個(gè)接一個(gè)的Stop-the-World階段灵奖。

并發(fā)清理

這一階段程序并發(fā)地工作容握,目的是移除所有不用的對(duì)象宣脉,并且重新聲明內(nèi)存空間的歸屬等候?qū)硎褂谩?/p>

這一階段程序并發(fā)地工作,目的是移除所有不用的對(duì)象剔氏,并且重新聲明內(nèi)存空間的歸屬等候?qū)硎褂谩?br>

并發(fā)重置

并發(fā)地重置所有算法需要的內(nèi)部數(shù)據(jù)結(jié)構(gòu)塑猖,為下一次GC做準(zhǔn)備。

CMS缺點(diǎn)

CMS收集器對(duì)CPU資源非常敏感谈跛。
在并發(fā)階段羊苟,它雖然不會(huì)導(dǎo)致用戶線程停頓,但是會(huì)因?yàn)檎加昧艘徊糠志€程(或者說是CPU資源)而導(dǎo)致應(yīng)用程序變慢感憾,總吞吐量會(huì)降低蜡励。CMS默認(rèn)啟動(dòng)的回收線程數(shù)是(CPU數(shù)量 + 3)/4(-XX:ParallelCMSThreads={x}:設(shè)置),也就是當(dāng)CPU在四個(gè)以上時(shí)(此時(shí)回收一個(gè)線程)阻桅,并發(fā)回收時(shí)垃圾收集線程不少于25%的CPU資源凉倚,并隨著CPU數(shù)量的增加而下降。但是當(dāng)CPU不足四個(gè)時(shí)嫂沉,CMS對(duì)用戶程序的影響就可能變得很大稽寒,為了應(yīng)對(duì)這種情況,虛擬機(jī)提供了一種稱為“增量式并發(fā)收集器”的CMS收集器變種趟章,其實(shí)就是一種搶占式來模擬多任務(wù)機(jī)制杏糙,讓多個(gè)線程交替運(yùn)行慎王,盡量減少GC線程獨(dú)占資源的時(shí)間,這樣整個(gè)垃圾收集的過程會(huì)變長(zhǎng)搔啊,但是對(duì)用戶程序的影響會(huì)變小柬祠,速度下降也就沒那么明顯了。實(shí)踐證明负芋,此變種很一般漫蛔,現(xiàn)在已不再提倡使用。

CMS收集器無法處理浮動(dòng)垃圾(Floating Garbage)旧蛾,可能出現(xiàn)“Concurrent Mode Failure”失敗而導(dǎo)致另一次Full GC產(chǎn)生莽龟。由于CMS并發(fā)清理階段用戶線程還在運(yùn)行,伴隨程序運(yùn)行自然就還會(huì)有新的垃圾不斷產(chǎn)生锨天,這一部分垃圾出現(xiàn)在標(biāo)記過程之后毯盈,CMS無法在檔次收集中處理掉它們,只好留待下一次GC時(shí)再清理掉病袄。這一部分垃圾稱為“浮動(dòng)垃圾”搂赋。正是由于垃圾收集過程中,用戶線程還要執(zhí)行益缠,那么也就需要預(yù)留足夠的內(nèi)存空間給用戶線程使用脑奠,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全填滿后再進(jìn)行垃圾收集,需要預(yù)留一部分空間提供并發(fā)收集時(shí)的程序運(yùn)作使用幅慌∷纹郏可以使用參數(shù)-XX:CMSInitiatingOccupancyFraction來設(shè)置老年代的閾值,在JDK1.5中設(shè)置為當(dāng)老年代使用了68%就會(huì)被激活進(jìn)行垃圾收集胰伍,JDK1.6中設(shè)置為92%齿诞。要是CMS運(yùn)行期間預(yù)留的內(nèi)存無法滿足程序需要,居會(huì)出現(xiàn)一次“Concurrent Mode Failure”失敗骂租,這時(shí)虛擬機(jī)將啟動(dòng)后備預(yù)案:臨時(shí)啟用Serial Old收集器重新進(jìn)行老年代的垃圾收集祷杈,此時(shí)停頓時(shí)間就會(huì)很長(zhǎng)了。所以該參數(shù)設(shè)置得太高可能反而會(huì)降低性能渗饮。

由于CMS是一款基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器但汞,在收集結(jié)束后會(huì)有大量的空間碎片產(chǎn)生。這將會(huì)給大對(duì)象分配帶來很大麻煩抽米,往往會(huì)出現(xiàn)老年代還有很大空間剩余,但是無法找到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象不得不提前觸發(fā)一次Full GC糙置。為了解決此問題云茸,CMS收集器提供了一個(gè)-XX:+UseCMSCompactAtFullCollection開關(guān)參數(shù)(默認(rèn)是開啟),用于在CMS收集器頂不住要進(jìn)行Full GC時(shí)開啟內(nèi)存碎片的合并整理過程谤饭,內(nèi)存整理的過程是無法并發(fā)執(zhí)行的标捺,空間碎片問題沒有了懊纳,但停頓時(shí)間不得不變長(zhǎng)。還提供了參數(shù)-XX:CMSFullGCsBeforeCompaction亡容,這個(gè)參數(shù)用于設(shè)置執(zhí)行多少次不壓縮(不整理)的Full GC后嗤疯,跟著來一次帶壓縮的(默認(rèn)為零,表示每次進(jìn)入Full GC時(shí)都進(jìn)行碎片整理)闺兢。

(5)茂缚、G1垃圾收集器

G1將新生代,老年代的物理空間劃分取消了屋谭,取而代之的是脚囊,G1算法將堆劃分為若干個(gè)區(qū)域(Region),區(qū)域分為新生代桐磁、老年代悔耘,它仍然屬于分代收集器。

新生代的垃圾收集依然采用暫停所有應(yīng)用線程的方式我擂,將存活對(duì)象拷貝到老年代或者Survivor空間衬以。

老年代也分成很多區(qū)域,G1收集器通過將對(duì)象從一個(gè)區(qū)域復(fù)制到另外一個(gè)區(qū)域校摩,完成了清理工作看峻,避免CMS內(nèi)存碎片問題。

在G1中秧耗,還有一種特殊的區(qū)域备籽,叫Humongous區(qū)域,專門用于存儲(chǔ)巨大對(duì)象分井。如果一個(gè)對(duì)象占用的空間超過了分區(qū)容量50%以上车猬,G1收集器就認(rèn)為這是一個(gè)巨型對(duì)象。這些巨型對(duì)象尺锚,默認(rèn)直接會(huì)被分配在年老代珠闰,但是如果它是一個(gè)短期存在的巨型對(duì)象,就會(huì)對(duì)垃圾收集器造成負(fù)面影響瘫辩。

對(duì)象分配情況分三種:TLAB(Thread Local Allocation Buffer)線程本地分配緩沖區(qū)伏嗜、Eden區(qū)中分配、Humongous區(qū)分配伐厌。

G1提供了兩種GC模式承绸,Young GC和Mixed GC,兩種都是Stop The World(STW)的挣轨。

Young GC

Young GC主要是對(duì)Eden區(qū)進(jìn)行GC军熏,它在Eden空間耗盡時(shí)會(huì)被觸發(fā)。在這種情況下卷扮,Eden空間的數(shù)據(jù)移動(dòng)到Survivor空間中荡澎,如果Survivor空間不夠均践,Eden空間的部分?jǐn)?shù)據(jù)會(huì)直接晉升到年老代空間(Survivor區(qū)的數(shù)據(jù)移動(dòng)到新的Survivor區(qū)中,也有部分?jǐn)?shù)據(jù)晉升到老年代空間中摩幔。)彤委。最終Eden空間的數(shù)據(jù)為空,GC停止工作或衡,應(yīng)用線程繼續(xù)執(zhí)行焦影。


如果僅僅GC 新生代對(duì)象,我們?nèi)绾握业剿械母鶎?duì)象呢薇宠? 老年代的所有對(duì)象都是根么偷办?那這樣掃描下來會(huì)耗費(fèi)大量的時(shí)間。于是澄港,G1引進(jìn)了RSet的概念椒涯。它的全稱是Remembered Set,作用是跟蹤指向某個(gè)heap區(qū)內(nèi)的對(duì)象引用回梧。這樣就避免掃描整個(gè)老年代废岂。(在CMS中,也有RSet的概念狱意,在老年代中有一塊區(qū)域用來記錄指向新生代的引用湖苞。)


如果引用的對(duì)象很多,賦值器需要對(duì)每個(gè)引用做處理详囤,賦值器開銷會(huì)很大财骨,為了解決賦值器開銷這個(gè)問題,在G1 中又引入了另外一個(gè)概念藏姐,卡表(CardTable)隆箩。一個(gè)CardTable將一個(gè)分區(qū)在邏輯上劃分為固定大小的連續(xù)區(qū)域,每個(gè)區(qū)域稱之為卡羔杨“齐卡通常較小,介于128到512字節(jié)之間兜材。CardTable通常為字節(jié)數(shù)組理澎,由Card的索引(即數(shù)組下標(biāo))來標(biāo)識(shí)每個(gè)分區(qū)的空間地址。默認(rèn)情況下曙寡,每個(gè)卡都未被引用糠爬。當(dāng)一個(gè)地址空間被引用時(shí),這個(gè)地址空間對(duì)應(yīng)的數(shù)組索引的值被標(biāo)記為”0″举庶,即標(biāo)記為臟被引用执隧,此外RSet也將這個(gè)數(shù)組下標(biāo)記錄下來。一般情況下,這個(gè)RSet其實(shí)是一個(gè)HashTable殴玛,Key是別的Region的起始地址,Value是一個(gè)集合添祸,里面的元素是Card Table的Index滚粟。

Young GC 階段:

階段1:根掃描

靜態(tài)和本地對(duì)象被掃描

階段2:更新RS

處理dirty card隊(duì)列更新RS

階段3:處理RS

檢測(cè)從年輕代指向年老代的對(duì)象

階段4:對(duì)象拷貝

拷貝存活的對(duì)象到survivor/old區(qū)域

階段5:處理引用隊(duì)列

軟引用,弱引用刃泌,虛引用處理

Mix GC

Mix GC不僅進(jìn)行正常的新生代垃圾收集凡壤,同時(shí)也回收部分后臺(tái)掃描線程標(biāo)記的老年代分區(qū)。

它的GC步驟分2步:

全局并發(fā)標(biāo)記(global concurrent marking)

拷貝存活對(duì)象(evacuation)

全局并發(fā)標(biāo)記主要是為Mixed GC提供標(biāo)記服務(wù)的耙替,但并不是一次GC過程的一個(gè)必須環(huán)節(jié)亚侠。

STAB(snapshot-at-the-beginning)介紹:

重新標(biāo)記階段中,假如重新標(biāo)記前對(duì)象引用如下


這時(shí)候應(yīng)用程序執(zhí)行了以下操作:A.c=C俗扇;B.c=null硝烂;這樣,對(duì)象的狀態(tài)圖變成如下情形:

此時(shí)C是白色铜幽,被認(rèn)為是垃圾需要清理掉滞谢,顯然這是不合理的。那么我們?nèi)绾伪WC應(yīng)用程序在運(yùn)行的時(shí)候除抛,GC標(biāo)記的對(duì)象不丟失呢狮杨?有如下2中可行的方式:

在插入的時(shí)候記錄對(duì)象

在刪除的時(shí)候記錄對(duì)象

剛好這對(duì)應(yīng)CMS和G1的2種不同實(shí)現(xiàn)方式:

在CMS采用的是增量更新(Incremental update),只要在寫屏障(write barrier)里發(fā)現(xiàn)要有一個(gè)白對(duì)象的引用被賦值到一個(gè)黑對(duì)象 的字段里到忽,那就把這個(gè)白對(duì)象變成灰色的橄教。即插入的時(shí)候記錄下來。

在G1中喘漏,使用的是STAB(snapshot-at-the-beginning)的方式护蝶,刪除的時(shí)候記錄所有的對(duì)象,它有3個(gè)步驟:

1陷遮,在開始標(biāo)記的時(shí)候生成一個(gè)快照?qǐng)D標(biāo)記存活對(duì)象

2滓走,在并發(fā)標(biāo)記的時(shí)候所有被改變的對(duì)象入隊(duì)(在write barrier里把所有舊的引用所指向的對(duì)象都變成非白的)

3,可能存在游離的垃圾帽馋,將在下次被收集

這樣搅方,G1到現(xiàn)在可以知道哪些老的分區(qū)可回收垃圾最多。 當(dāng)全局并發(fā)標(biāo)記完成后绽族,在某個(gè)時(shí)刻姨涡,就開始了Mix GC。這些垃圾回收被稱作“混合式”是因?yàn)樗麄儾粌H僅進(jìn)行正常的新生代垃圾收集吧慢,同時(shí)也回收部分后臺(tái)掃描線程標(biāo)記的分區(qū)涛漂。

謝謝分享:

http://www.reibang.com/p/144fe73ad694

http://www.cnblogs.com/ASPNET2008/p/6496481.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匈仗,更是在濱河造成了極大的恐慌瓢剿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠轩,死亡現(xiàn)場(chǎng)離奇詭異间狂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)火架,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鉴象,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人何鸡,你說我怎么就攤上這事纺弊。” “怎么了骡男?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵淆游,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我隔盛,道長(zhǎng)稽犁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任骚亿,我火速辦了婚禮已亥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来屠。我一直安慰自己虑椎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布俱笛。 她就那樣靜靜地躺著捆姜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迎膜。 梳的紋絲不亂的頭發(fā)上泥技,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音磕仅,去河邊找鬼珊豹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛榕订,可吹牛的內(nèi)容都是我干的店茶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劫恒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贩幻!你這毒婦竟也來了轿腺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤丛楚,失蹤者是張志新(化名)和其女友劉穎族壳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣些,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡决侈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喧务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枉圃,死狀恐怖功茴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孽亲,我是刑警寧澤坎穿,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站返劲,受9級(jí)特大地震影響玲昧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篮绿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一孵延、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亲配,春花似錦尘应、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至思灰,卻和暖如春玷犹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洒疚。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工歹颓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人油湖。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓晴股,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肺魁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子电湘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容