Java垃圾收集器

?若果說(shuō)收集算法是內(nèi)存會(huì)說(shuō)的方法論辨液,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)虐急。Java虛擬機(jī)中對(duì)垃圾收集器應(yīng)該如何實(shí)現(xiàn)并沒(méi)有任何規(guī)定,因此不同的廠商滔迈、不同版本的虛擬機(jī)所提供的垃圾收集器可能會(huì)有很大差別止吁,并且一般都會(huì)提供參數(shù)供用戶根據(jù)自己的應(yīng)用特點(diǎn)和要求組合使用各個(gè)年代所使用的收集器。HotSpot虛擬機(jī)包含的收集器入下圖所示:

HotSpot垃圾收集器

?上圖展示了7種作用于不同分代的收集器燎悍,如果兩個(gè)收集器之間有連線敬惦,就說(shuō)明他們可以搭配使用;虛擬機(jī)所處的區(qū)域,則表示它是屬于新生代收集器還是老年代收集器谈山。Hotspot實(shí)現(xiàn)了如此多的收集器俄删,正是因?yàn)槟壳安o(wú)完美的收集器出現(xiàn),只是選擇對(duì)具體應(yīng)用最適合的收集器。


一畴椰、Serial收集器

?Serial(串行)收集器是一個(gè)最基本的臊诊,發(fā)展歷史悠久的單線程串行收集器,它在新生代采用復(fù)制算法斜脂,老年代采用標(biāo)記-整理算法抓艳;但它的“單線程”的意義并不僅僅說(shuō)明它只會(huì)使用一個(gè)CPU或者一條收集線程去完成垃圾收集工作,更重要的是它在進(jìn)行垃圾收集時(shí)帚戳,必須暫停其他所有的工作線程壶硅,直到它收集結(jié)束(“Stop The World”)。這項(xiàng)工作是由虛擬機(jī)在后臺(tái)自動(dòng)發(fā)起和自動(dòng)完成的销斟,在用戶不可見(jiàn)的情況下把用戶正常工作的線程全部停掉庐椒,這對(duì)很多應(yīng)用來(lái)說(shuō)是難以接收的。Serial/Serial Old收集器(新生代采用Serial收集器蚂踊,老年代采用Serial Old收集器)的運(yùn)行過(guò)程如圖:

Serial/Serial Old收集器

?雖然“Stop The World”給用戶帶來(lái)很大的不良的體驗(yàn)约谈,但是它依然是虛擬機(jī)運(yùn)行在Client模式下的默認(rèn)新生代收集器。它也有著優(yōu)于其他收集器的地方:簡(jiǎn)單高效(與其他收集器的單線程比)犁钟,對(duì)于限定單個(gè)CPU的環(huán)境來(lái)說(shuō)棱诱,Serial收集器優(yōu)于沒(méi)有線程交互的開(kāi)銷(xiāo),專(zhuān)心做垃圾收集自然可以獲得最高的單線程收集效率涝动。


二迈勋、ParNew收集器

?ParNew收集器其實(shí)就是Serial收集器的多線程版本,除了使用多線程進(jìn)行垃圾收集之外醋粟,其余行為包括Serial收集器可用的所有控制參數(shù)(例如:-XX:SurvivorRatio靡菇、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)米愿、收集算法厦凤、Stop The World、對(duì)象分配規(guī)則育苟、回收策略等都與Serial收集器完全一樣较鼓。ParNew收集器的工作過(guò)程如圖:


ParNew/Serial Old收集器

?ParNew收集器除了使用多線程收集外,其他與Serial收集器相比并無(wú)太多創(chuàng)新之處违柏,但它卻是許多運(yùn)行在Server模式下的虛擬機(jī)中首選的新生代收集器博烂,其中有一個(gè)與性能無(wú)關(guān)的重要原因是,除了Serial收集器外漱竖,目前只有它能和CMS收集器(Concurrent Mark Sweep)配合工作禽篱,CMS收集器是JDK 1.5推出的一個(gè)具有劃時(shí)代意義的收集器,具體內(nèi)容將在稍后進(jìn)行介紹闲孤。

?ParNew 收集器在單CPU的環(huán)境中絕對(duì)不會(huì)有比Serial收集器有更好的效果谆级,甚至由于存在線程交互的開(kāi)銷(xiāo),該收集器在通過(guò)超線程技術(shù)實(shí)現(xiàn)的兩個(gè)CPU的環(huán)境中都不能百分之百地保證可以超越讼积。在多CPU環(huán)境下肥照,隨著CPU的數(shù)量增加,它對(duì)于GC時(shí)系統(tǒng)資源的有效利用是很有好處的勤众。它默認(rèn)開(kāi)啟的收集線程數(shù)與CPU的數(shù)量相同舆绎,在CPU非常多的情況下可使用-XX:ParallerGCThreads參數(shù)設(shè)置。


四们颜、 Parallel Scavenge收集器

?Parallel Scavenge收集器是一個(gè)新生代收集器吕朵,它也是使用復(fù)制算法的收集器,又是并行的多線程收集器窥突。它的特點(diǎn)是它的關(guān)注點(diǎn)與其他收集器不同努溃,CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間,而Parallel Scavenge收集器的目標(biāo)是達(dá)到一個(gè)可控制的吞吐量(Throughput)阻问,也即CPU用于運(yùn)行用戶代碼的時(shí)間與CPU總消耗時(shí)間的比值梧税,即吞吐量=運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間 + 垃圾收集時(shí)間)。
?停頓時(shí)間越短就越適合需要與用戶交互的程序称近,良好的響應(yīng)速度能提升用戶體驗(yàn)第队,而高吞吐量則可以高效率利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù)刨秆,主要適合在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)凳谦。
?Parallel Scavenge收集器提供了兩個(gè)參數(shù)用于精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間的-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)衡未。
?除以上參數(shù)外尸执,Parallel Scavenge收集器還有一個(gè)參數(shù)-XX:+UseAdaptiveSizePolicy值得關(guān)注。這是一個(gè)開(kāi)關(guān)參數(shù)缓醋,當(dāng)這個(gè)參數(shù)打開(kāi)之后剔交,就不需要手工指定新生代的大小(-Xmn)、Eden與Survivor區(qū)的比例(-XX:SurvivorRatio)改衩、晉升老年代對(duì)象年齡(-XX:PretenureSizeThreshold)等細(xì)節(jié)參數(shù)了岖常,虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)控信息,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時(shí)間或者最大的吞吐量葫督,這種調(diào)節(jié)方式稱(chēng)為GC自適應(yīng)的調(diào)整策略(GC Ergonomics)竭鞍。自適應(yīng)調(diào)節(jié)策略也是Parallel Scavenge收集器與ParNew收集器的一個(gè)重要區(qū)別。


五橄镜、Serial Old收集器

?Serial Old收集器的老年代版本偎快,它同樣是一個(gè)單線程收集器,使用“標(biāo)記-整理”算法洽胶。這個(gè)收集器的主要意義也是在于給Client模式下的虛擬機(jī)使用晒夹。如果在Server模式下,它還有兩大用途:

  • 在JDK1.5 以及之前版本(Parallel Old誕生以前)中與Parallel Scavenge收集器搭配使用。
  • 作為CMS收集器的后備預(yù)案丐怯,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用喷好。

六居触、Parallel Old收集器

?Parallel Old收集器時(shí)Parallel Scavenge收集器的老年代版本围橡,使用多線程和“標(biāo)記-整理”算法。這個(gè)收集器在JDK1.6中才開(kāi)始提供的衰猛,在此之前效览,新生代的Parallel Scavenge收集器一直處于比較尷尬的狀態(tài)无切。原因是,如果新生代選擇了Parallel Scavenge收集器丐枉,老年代除了Serial Old收集器外別無(wú)選擇哆键。由于老年代Serial Old收集器在服務(wù)端應(yīng)用性能上的“拖累”,使用了Parallel Scavenge收集器也未必能在整體應(yīng)用上獲得吞吐量最大化的效果瘦锹,由于單線程的老年代收集中無(wú)法充分利用服務(wù)器多CPU的處理能力洼哎。
?直到Parallel Old搜狐及其出現(xiàn)后,“吞吐量?jī)?yōu)先”收集器終于有了比較名副其實(shí)的應(yīng)用組合沼本,在注重吞吐量以及CPU資源敏感的場(chǎng)合噩峦,都可以優(yōu)先考慮Parallel Scavenge加Parallel Old收集器。Parallel Old收集器的工作過(guò)程如圖:


Parallel Scavenge/Parallel Old收集器

七抽兆、CMS收集器

?CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器识补。目前很大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)或者B/S系統(tǒng)的服務(wù)端上,這類(lèi)應(yīng)用尤其重視服務(wù)的響應(yīng)速度辫红,希望停頓時(shí)間最短凭涂,以給用戶帶來(lái)較好的體驗(yàn)。CMS收集器就非常符合這類(lèi)應(yīng)用的需求贴妻。
?CMS收集器時(shí)基于“標(biāo)記-清除”算法實(shí)現(xiàn)的切油,它的運(yùn)作過(guò)程相對(duì)于前面幾種收集器來(lái)說(shuō)更復(fù)雜一些,整個(gè)過(guò)程分為四個(gè)步驟:

  • 初始標(biāo)記(CMS initial mark):僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象名惩,速度很快澎胡,需要“Stop The World”。
  • 并發(fā)標(biāo)記(CMS concurrent mark):GC Roots Tracing的過(guò)程
  • 重新標(biāo)記(CMS remark):為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄娩鹉,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍長(zhǎng)一些攻谁,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。
  • 并發(fā)清除(CMS concurrent sweep):
    ?由于整個(gè)過(guò)程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過(guò)程收集器線程都可以與用戶線程一起工作弯予,所以戚宦,從總體上來(lái)說(shuō),CMS收集器的內(nèi)存回收過(guò)程是與用戶線程一起并發(fā)執(zhí)行的锈嫩。通過(guò)下圖可以比較清楚地看到CMS收集器的運(yùn)作步驟中并發(fā)和需要停頓的時(shí)間:
    CMS垃圾收集器

優(yōu)點(diǎn)

  • CMS是一款優(yōu)秀的收集器受楼,它的主要優(yōu)點(diǎn)在名字上已經(jīng)體現(xiàn)出來(lái)了:并發(fā)收集垦搬、低停頓,因此CMS收集器也被稱(chēng)為并發(fā)低停頓收集器(Concurrent Low Pause Collector)艳汽。

缺點(diǎn)

  • 對(duì)CPU資源非常敏感其實(shí)猴贰,面向并發(fā)設(shè)計(jì)的程序都對(duì)CPU資源比較敏感。在并發(fā)階段骚灸,它雖然不會(huì)導(dǎo)致用戶線程停頓,但會(huì)因?yàn)檎加昧艘徊糠志€程(或者說(shuō)CPU資源)而導(dǎo)致應(yīng)用程序變慢慌植,總吞吐量會(huì)降低甚牲。CMS默認(rèn)啟動(dòng)的回收線程數(shù)是(CPU數(shù)量+3)/4,也就是當(dāng)CPU在4個(gè)以上時(shí)蝶柿,并發(fā)回收時(shí)垃圾收集線程不少于25%的CPU資源丈钙,并且隨著CPU數(shù)量的增加而下降。但是當(dāng)CPU不足4個(gè)時(shí)(比如2個(gè))交汤,CMS對(duì)用戶程序的影響就可能變得很大雏赦,如果本來(lái)CPU負(fù)載就比較大,還要分出一半的運(yùn)算能力去執(zhí)行收集器線程芙扎,就可能導(dǎo)致用戶程序的執(zhí)行速度忽然降低了50%星岗,其實(shí)也讓人無(wú)法接受。
  • 無(wú)法處理浮動(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)記過(guò)程之后圈浇,CMS無(wú)法再當(dāng)次收集中處理掉它們寥掐,只好留待下一次GC時(shí)再清理掉。這一部分垃圾就被稱(chēng)為“浮動(dòng)垃圾”磷蜀。也是由于在垃圾收集階段用戶線程還需要運(yùn)行召耘,那也就還需要預(yù)留有足夠的內(nèi)存空間給用戶線程使用,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進(jìn)行收集褐隆,需要預(yù)留一部分空間提供并發(fā)收集時(shí)的程序運(yùn)作使用污它。
  • 標(biāo)記-清除算法導(dǎo)致的空間碎片 CMS是一款基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器,這意味著收集結(jié)束時(shí)會(huì)有大量空間碎片產(chǎn)生庶弃」旄颍空間碎片過(guò)多時(shí),將會(huì)給大對(duì)象分配帶來(lái)很大麻煩虫埂,往往出現(xiàn)老年代空間剩余祥山,但無(wú)法找到足夠大連續(xù)空間來(lái)分配當(dāng)前對(duì)象。

八掉伏、G1收集器

?G1(Garbage-First)是一款面向服務(wù)端應(yīng)用的垃圾收集器缝呕,未來(lái)可以替換掉JDK1.5中發(fā)布的CMS收集器澳窑。與其他GC收集器相比,G1具備如下特點(diǎn):

  • 并行與并發(fā):G1能充分利用CPU供常、多核環(huán)境下的硬件優(yōu)勢(shì)摊聋,使用多個(gè)CPU(CPU或者CPU核心)來(lái)縮短Stop-The-World停頓的時(shí)間,部分其他收集器原本需要停頓Java線程執(zhí)行的GC動(dòng)作栈暇,G1收集器仍然可以通過(guò)并發(fā)的方式讓Java程序繼續(xù)執(zhí)行麻裁。
  • 分代收集:與其他收集器一樣源祈,分代概念在G1中依然得以保留。雖然G1可以不需要其他收集器配合就能獨(dú)立管理整個(gè)GC堆香缺,但它能夠采用不同的方式去處理新創(chuàng)建的對(duì)象和已經(jīng)存活了一段時(shí)間、熬過(guò)多次GC的舊對(duì)象以獲取更好的手機(jī)效果图张。
  • 空間整合:與CMS的“標(biāo)記-清理”算法不同,G1從整體來(lái)看是基于“標(biāo)記-整理”算法實(shí)現(xiàn)的收集器祸轮,從局部(兩個(gè)Region之間)上來(lái)看是基于“復(fù)制”算法實(shí)現(xiàn)的,但無(wú)論如何适袜,這兩種算法都意味著G1運(yùn)作期間不會(huì)產(chǎn)生內(nèi)存空間碎片,收集后能提供規(guī)整的可用內(nèi)存痪蝇。這種特性有利于程序長(zhǎng)時(shí)間運(yùn)行,分配大對(duì)象時(shí)不會(huì)因?yàn)闊o(wú)法找到連續(xù)內(nèi)存空間而提前觸發(fā)下一次GC躏啰。
  • 可預(yù)測(cè)的停頓:這是G1相對(duì)于CMS的另一大優(yōu)勢(shì)趁矾,降低停頓時(shí)間是G1和CMS共同的關(guān)注點(diǎn),但G1除了追求低停頓外给僵,還能建立可預(yù)測(cè)的停頓時(shí)間模型毫捣,能讓使用者明確指定在一個(gè)長(zhǎng)度為M毫秒的時(shí)間片段內(nèi),消耗在垃圾收集上的時(shí)間不得超過(guò)N毫秒帝际,這幾乎已經(jīng)是實(shí)時(shí)Java(RTSJ)的垃圾收集器的特征了蔓同。
    橫跨整個(gè)堆內(nèi)存

?在G1之前的其他收集器進(jìn)行收集的范圍都是整個(gè)新生代或者老生代,而G1不再是這樣蹲诀。G1在使用時(shí)斑粱,Java堆的內(nèi)存布局與其他收集器有很大區(qū)別,它將整個(gè)Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region)脯爪,雖然還保留新生代和老年代的概念则北,但新生代和老年代不再是物理隔離的了矿微,而都是一部分Region(不需要連續(xù))的集合。

建立可預(yù)測(cè)的時(shí)間模型

?G1收集器之所以能建立可預(yù)測(cè)的停頓時(shí)間模型尚揣,是因?yàn)樗梢杂杏?jì)劃地避免在整個(gè)Java堆中進(jìn)行全區(qū)域的垃圾收集涌矢。G1跟蹤各個(gè)Region里面的垃圾堆積的價(jià)值大小(回收所獲得的空間大小以及回收所需時(shí)間的經(jīng)驗(yàn)值)快骗,在后臺(tái)維護(hù)一個(gè)優(yōu)先列表娜庇,每次根據(jù)允許的收集時(shí)間,優(yōu)先回收價(jià)值最大的Region(這也就是Garbage-First名稱(chēng)的來(lái)由)方篮。這種使用Region劃分內(nèi)存空間以及有優(yōu)先級(jí)的區(qū)域回收方式名秀,保證了G1收集器在有限的時(shí)間內(nèi)可以獲取盡可能高的收集效率。

避免全堆掃描——Remembered Set

?G1把Java堆分為多個(gè)Region恭取,就是“化整為零”泰偿。但是Region不可能是孤立的熄守,一個(gè)對(duì)象分配在某個(gè)Region中蜈垮,可以與整個(gè)Java堆任意的對(duì)象發(fā)生引用關(guān)系。在做可達(dá)性分析確定對(duì)象是否存活的時(shí)候裕照,需要掃描整個(gè)Java堆才能保證準(zhǔn)確性攒发,這顯然是對(duì)GC效率的極大傷害。

?為了避免全堆掃描的發(fā)生晋南,虛擬機(jī)為G1中每個(gè)Region維護(hù)了一個(gè)與之對(duì)應(yīng)的Remembered Set惠猿。虛擬機(jī)發(fā)現(xiàn)程序在對(duì)Reference類(lèi)型的數(shù)據(jù)進(jìn)行寫(xiě)操作時(shí)负间,會(huì)產(chǎn)生一個(gè)Write Barrier暫時(shí)中斷寫(xiě)操作,檢查Reference引用的對(duì)象是否處于不同的Region之中(在分代的例子中就是檢查是否老年代中的對(duì)象引用了新生代中的對(duì)象)趾访,如果是扼鞋,便通過(guò)CardTable把相關(guān)引用信息記錄到被引用對(duì)象所屬的Region的Remembered Set之中云头。當(dāng)進(jìn)行內(nèi)存回收時(shí)淫半,在GC根節(jié)點(diǎn)的枚舉范圍中加入Remembered Set即可保證不對(duì)全堆掃描也不會(huì)有遺漏科吭。

?如果不計(jì)算維護(hù)Remembered Set的操作脆粥,G1收集器的運(yùn)作大致可劃分為以下幾個(gè)步驟:

  • 初始標(biāo)記(Initial Marking) 僅僅只是標(biāo)記一下GC Roots 能直接關(guān)聯(lián)到的對(duì)象变隔,并且修改TAMS(Nest Top Mark Start)的值匣缘,讓下一階段用戶程序并發(fā)運(yùn)行時(shí)肌厨,能在正確可以的Region中創(chuàng)建對(duì)象柑爸,此階段需要停頓線程盒音,但耗時(shí)很短。
  • 并發(fā)標(biāo)記(Concurrent Marking) 從GC Root 開(kāi)始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析譬圣,找到存活對(duì)象厘熟,此階段耗時(shí)較長(zhǎng)绳姨,但可與用戶程序并發(fā)執(zhí)行阔挠。
    最終標(biāo)記(Final Marking) 為了修正在并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分標(biāo)記記錄谒亦,虛擬機(jī)將這段時(shí)間對(duì)象變化記錄在線程的Remembered Set Logs里面份招,最終標(biāo)記階段需要把Remembered Set Logs的數(shù)據(jù)合并到Remembered Set中,這階段需要停頓線程廓旬,但是可并行執(zhí)行孕豹。
  • 篩選回收(Live Data Counting and Evacuation) 首先對(duì)各個(gè)Region中的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的GC 停頓是時(shí)間來(lái)制定回收計(jì)劃春霍。此階段其實(shí)也可以做到與用戶程序一起并發(fā)執(zhí)行址儒,但是因?yàn)橹换厥找徊糠諶egion莲趣,時(shí)間是用戶可控制的饱溢,而且停頓用戶線程將大幅度提高收集效率绩郎。

?通過(guò)下圖可以比較清楚地看到G1收集器的運(yùn)作步驟中并發(fā)和需要停頓的階段(Safepoint處):


G1收集器

總結(jié)

收集器 串行嗽上、并行or并發(fā) 新生代/老年代 算法 目標(biāo) 適用場(chǎng)景
Serial 串行 新生代 復(fù)制算法 響應(yīng)速度優(yōu)先 單CPU環(huán)境下的Client模式
Serial Old 串行 老年代 標(biāo)記-整理 響應(yīng)速度優(yōu)先 單CPU環(huán)境下的Client模式兽愤、CMS的后備預(yù)案
ParNew 并行 新生代 復(fù)制算法 響應(yīng)速度優(yōu)先 多CPU環(huán)境時(shí)在Server模式下與CMS配合
Parallel Scavenge 并行 新生代 復(fù)制算法 吞吐量?jī)?yōu)先 在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)
Parallel Old 并行 老年代 標(biāo)記-整理 吞吐量?jī)?yōu)先 在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)
CMS 并發(fā) 老年代 標(biāo)記-清除 響應(yīng)速度優(yōu)先 集中在互聯(lián)網(wǎng)站或B/S系統(tǒng)服務(wù)端上的Java應(yīng)用
G1 并發(fā) Both 標(biāo)記-整理+復(fù)制算法 響應(yīng)速度優(yōu)先 面向服務(wù)端應(yīng)用浅萧,將來(lái)替換CMS

參考資料

  • [《深入理解Java虛擬機(jī)——JVM高級(jí)特性與最佳實(shí)踐》-周志明]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洼畅,一起剝皮案震驚了整個(gè)濱河市帝簇,隨后出現(xiàn)的幾起案子丧肴,更是在濱河造成了極大的恐慌芋浮,老刑警劉巖壳快,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘤旨,居然都是意外死亡存哲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)羽嫡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杭棵,“玉大人魂爪,你說(shuō)我怎么就攤上這事艰管∩螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵夕冲,是天一觀的道長(zhǎng)歹鱼。 經(jīng)常有香客問(wèn)我弥姻,道長(zhǎng)庭敦,這世上最難降的妖魔是什么鸽照? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮赔癌,結(jié)果婚禮上灾票,老公的妹妹穿的比我還像新娘茫虽。我一直安慰自己,他們只是感情好正什,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布婴氮。 她就那樣靜靜地躺著主经,像睡著了一般罩驻。 火紅的嫁衣襯著肌膚如雪护赊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天爽哎,我揣著相機(jī)與錄音,去河邊找鬼厨内。 笑死,一個(gè)胖子當(dāng)著我的面吹牛请毛,可吹牛的內(nèi)容都是我干的方仿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼此洲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呜师!你這毒婦竟也來(lái)了汁汗?” 一聲冷哼從身側(cè)響起栗涂,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤送爸,失蹤者是張志新(化名)和其女友劉穎暖释,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纹磺,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橄杨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年式矫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了采转。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞬痘。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡察绷,死狀恐怖津辩,靈堂內(nèi)的尸體忽然破棺而出容劳,到底是詐尸還是另有隱情鸭蛙,我是刑警寧澤娶视,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布肪获,位于F島的核電站柒傻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏红符。R本人自食惡果不足惜预侯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一萎馅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糜芳,春花似錦峭竣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春守呜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背查乒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工玛迄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虏杰。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓纺阔,卻偏偏與公主長(zhǎng)得像修然,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玻靡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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