jvm 線上調(diào)優(yōu)總結(jié)

1罩缴、JVM調(diào)優(yōu)目標:使用較小的內(nèi)存占用來獲得較高的吞吐量或者較低的延遲。

程序在上線前的測試或運行中有時會出現(xiàn)一些大大小小的JVM問題,比如cpu load過高褂微、請求延遲、tps降低等沛贪,甚至出現(xiàn)內(nèi)存泄漏(每次垃圾收集使用的時間越來越長产舞,垃圾收集頻率越來越高梦裂,每次垃圾收集清理掉的垃圾數(shù)據(jù)越來越少)、內(nèi)存溢出導致系統(tǒng)崩潰求厕,因此需要對JVM進行調(diào)優(yōu),使得程序在正常運行的前提下扰楼,獲得更高的用戶體驗和運行效率呀癣。

這里有幾個比較重要的指標:

內(nèi)存占用:程序正常運行需要的內(nèi)存大小。

延遲:由于垃圾收集而引起的程序停頓時間弦赖。

吞吐量:用戶程序運行時間占用戶程序和垃圾收集占用總時間的比值项栏。

當然,和CAP原則一樣蹬竖,同時滿足一個程序內(nèi)存占用小沼沈、延遲低、高吞吐量是不可能的币厕,程序的目標不同列另,調(diào)優(yōu)時所考慮的方向也不同,在調(diào)優(yōu)之前旦装,必須要結(jié)合實際場景页衙,有明確的的優(yōu)化目標,找到性能瓶頸同辣,對瓶頸有針對性的優(yōu)化拷姿,最后進行測試,通過各種監(jiān)控工具確認調(diào)優(yōu)后的結(jié)果是否符合目標旱函。

2响巢、JVM調(diào)優(yōu)工具

(1)調(diào)優(yōu)可以依賴、參考的數(shù)據(jù)有系統(tǒng)運行日志棒妨、堆棧錯誤信息踪古、gc日志含长、線程快照、堆轉(zhuǎn)儲快照等伏穆。

①系統(tǒng)運行日志:系統(tǒng)運行日志就是在程序代碼中打印出的日志拘泞,描述了代碼級別的系統(tǒng)運行軌跡(執(zhí)行的方法、入?yún)⒄砩ā⒎祷刂档龋┡汶纾话阆到y(tǒng)出現(xiàn)問題,系統(tǒng)運行日志是首先要查看的日志烟瞧。

②堆棧錯誤信息:當系統(tǒng)出現(xiàn)異常后诗鸭,可以根據(jù)堆棧信息初步定位問題所在,比如根據(jù)“java.lang.OutOfMemoryError: Java heap space”可以判斷是堆內(nèi)存溢出参滴;根據(jù)“java.lang.StackOverflowError”可以判斷是棧溢出强岸;根據(jù)“java.lang.OutOfMemoryError: PermGen space”可以判斷是方法區(qū)溢出等。

③GC日志:程序啟動時用 -XX:+PrintGCDetails 和 -Xloggc:/data/jvm/gc.log 可以在程序運行時把gc的詳細過程記錄下來砾赔,或者直接配置“-verbose:gc”參數(shù)把gc日志打印到控制臺蝌箍,通過記錄的gc日志可以分析每塊內(nèi)存區(qū)域gc的頻率、時間等暴心,從而發(fā)現(xiàn)問題妓盲,進行有針對性的優(yōu)化。

比如如下一段GC日志:

2018-08-02T14:39:11.560-0800:10.171: [GC [PSYoungGen:30128K->4091K(30208K)]51092K->50790K(98816K),0.0140970secs] [Times: user=0.02sys=0.03, real=0.01secs]

2018-08-02T14:39:11.574-0800:10.185: [Full GC [PSYoungGen:4091K->0K(30208K)] [ParOldGen:46698K->50669K(68608K)]50790K->50669K(98816K) [PSPermGen:2635K->2634K(21504K)],0.0160030secs] [Times: user=0.03sys=0.00, real=0.02secs]

2018-08-02T14:39:14.045-0800:12.656: [GC [PSYoungGen:14097K->4064K(30208K)]64766K->64536K(98816K),0.0117690secs] [Times: user=0.02sys=0.01, real=0.01secs]

2018-08-02T14:39:14.057-0800:12.668: [Full GC [PSYoungGen:4064K->0K(30208K)] [ParOldGen:60471K->401K(68608K)]64536K->401K(98816K) [PSPermGen:2634K->2634K(21504K)],0.0102020secs] [Times: user=0.01sys=0.00, real=0.01secs]

上面一共是4條GC日志酷勺,來看第一行日志本橙,“2018-08-02T14:39:11.560-0800”是精確到了毫秒級別的UTC 通用標準時間格式,配置了“-XX:+PrintGCDateStamps”這個參數(shù)可以跟隨gc日志打印出這種時間戳脆诉,“10.171”是從JVM啟動到發(fā)生gc經(jīng)過的秒數(shù)甚亭。第一行日志正文開頭的“[GC”說明這次GC沒有發(fā)生Stop-The-World(用戶線程停頓),第二行日志正文開頭的“[Full GC”說明這次GC發(fā)生了Stop-The-World击胜,所以說亏狰,[GC和[Full GC跟新生代和老年代沒關系,和垃圾收集器的類型有關系偶摔,如果直接調(diào)用System.gc()暇唾,將顯示[Full GC(System)。接下來的“[PSYoungGen”辰斋、“[ParOldGen”表示GC發(fā)生的區(qū)域策州,具體顯示什么名字也跟垃圾收集器有關,比如這里的“[PSYoungGen”表示Parallel Scavenge收集器宫仗,“[ParOldGen”表示Serial Old收集器够挂,此外,Serial收集器顯示“[DefNew”藕夫,ParNew收集器顯示“[ParNew”等孽糖。再往后的“30128K->4091K(30208K)”表示進行了這次gc后枯冈,該區(qū)域的內(nèi)存使用空間由30128K減小到4091K,總內(nèi)存大小為30208K办悟。每個區(qū)域gc描述后面的“51092K->50790K(98816K), 0.0140970 secs”進行了這次垃圾收集后尘奏,整個堆內(nèi)存的內(nèi)存使用空間由51092K減小到50790K,整個堆內(nèi)存總空間為98816K病蛉,gc耗時0.0140970秒炫加。

④線程快照:顧名思義,根據(jù)線程快照可以看到線程在某一時刻的狀態(tài)铡恕,當系統(tǒng)中可能存在請求超時琢感、死循環(huán)、死鎖等情況是探熔,可以根據(jù)線程快照來進一步確定問題。通過執(zhí)行虛擬機自帶的“jstack pid”命令烘挫,可以dump出當前進程中線程的快照信息诀艰,更詳細的使用和分析網(wǎng)上有很多例,這篇文章寫到這里已經(jīng)很長了就不過多敘述了饮六,貼一篇博客供參考:http://www.cnblogs.com/kongzhongqijing/articles/3630264.html

⑤堆轉(zhuǎn)儲快照:程序啟動時可以使用 “-XX:+HeapDumpOnOutOfMemory” 和 “-XX:HeapDumpPath=/data/jvm/dumpfile.hprof”其垄,當程序發(fā)生內(nèi)存溢出時,把當時的內(nèi)存快照以文件形式進行轉(zhuǎn)儲(也可以直接用jmap命令轉(zhuǎn)儲程序運行時任意時刻的內(nèi)存快照)卤橄,事后對當時的內(nèi)存使用情況進行分析绿满。

(2)JVM調(diào)優(yōu)工具

①用 jps(JVM process Status)可以查看虛擬機啟動的所有進程、執(zhí)行主類的全名窟扑、JVM啟動參數(shù)喇颁,比如當執(zhí)行了JPSTest類中的main方法后(main方法持續(xù)執(zhí)行),執(zhí)行 jps -l可看到下面的JPSTest類的pid為31354嚎货,加上-v參數(shù)還可以看到JVM啟動參數(shù)橘霎。

3265

32914sun.tools.jps.Jps

31353org.jetbrains.jps.cmdline.Launcher

31354com.danny.test.code.jvm.JPSTest

380

②用jstat(JVM Statistics Monitoring Tool)監(jiān)視虛擬機信息

jstat -gc pid 500 10 :每500毫秒打印一次Java堆狀況(各個區(qū)的容量、使用容量殖属、gc時間等信息)姐叁,打印10次

S0C? ? S1C? ? S0U? ? S1U? ? ? EC? ? ? EU? ? ? ? OC? ? ? ? OU? ? ? MC? ? MU? ? CCSC? CCSU? YGC? ? YGCT? ? FGC? ? FGCT? ? GCT?

11264.011264.011202.70.011776.01154.368608.036238.7-? ? ? -? ? ? -? ? ? -140.07770.0490.126

11264.011264.011202.70.011776.04037.068608.036238.7-? ? ? -? ? ? -? ? ? -140.07770.0490.126

11264.011264.011202.70.011776.06604.568608.036238.7-? ? ? -? ? ? -? ? ? -140.07770.0490.126

11264.011264.011202.70.011776.09487.268608.036238.7-? ? ? -? ? ? -? ? ? -140.07770.0490.126

11264.011264.00.00.011776.0258.168608.058983.4-? ? ? -? ? ? -? ? ? -150.08280.0590.141

11264.011264.00.00.011776.03076.868608.058983.4-? ? ? -? ? ? -? ? ? -150.08280.0590.141

11264.011264.00.00.011776.00.068608.0390.0-? ? ? -? ? ? -? ? ? -160.08490.0660.149

11264.011264.00.00.011776.00.068608.0390.0-? ? ? -? ? ? -? ? ? -160.08490.0660.149

11264.011264.00.00.011776.0258.168608.0390.0-? ? ? -? ? ? -? ? ? -160.08490.0660.149

11264.011264.00.00.011776.03012.868608.0390.0-? ? ? -? ? ? -? ? ? -160.08490.0660.149

jstat還可以以其他角度監(jiān)視各區(qū)內(nèi)存大小、監(jiān)視類裝載信息等洗显,具體可以google jstat的詳細用法外潜。

③用jmap(Memory Map for Java)查看堆內(nèi)存信息

執(zhí)行jmap -histo pid可以打印出當前堆中所有每個類的實例數(shù)量和內(nèi)存占用,如下挠唆,class name是每個類的類名([B是byte類型处窥,[C是char類型,[I是int類型)损搬,bytes是這個類的所有示例占用內(nèi)存大小碧库,instances是這個類的實例數(shù)量:

num? ? #instances? ? ? ? #bytesclassname

----------------------------------------------

1:? ? ? ? ? 2291? ? ? 29274080? [B

2:? ? ? ? 15252? ? ? ? 1961040?

3:? ? ? ? 15252? ? ? ? 1871400?

4:? ? ? ? 18038? ? ? ? 721520java.util.TreeMap$Entry

5:? ? ? ? ? 6182? ? ? ? 530088? [C

6:? ? ? ? 11391? ? ? ? 273384java.lang.Long

7:? ? ? ? ? 5576? ? ? ? 267648java.util.TreeMap

8:? ? ? ? ? ? 50? ? ? ? 155872? [I

9:? ? ? ? ? 6124? ? ? ? 146976java.lang.String

10:? ? ? ? ? 3330? ? ? ? 133200java.util.LinkedHashMap$Entry

11:? ? ? ? ? 5544? ? ? ? 133056javax.management.openmbean.CompositeDataSupport

執(zhí)行 jmap -dump 可以轉(zhuǎn)儲堆內(nèi)存快照到指定文件柜与,比如執(zhí)行 jmap -dump:format=b,file=/data/jvm/dumpfile_jmap.hprof 3361 可以把當前堆內(nèi)存的快照轉(zhuǎn)儲到dumpfile_jmap.hprof文件中,然后可以對內(nèi)存快照進行分析嵌灰。

④利用jconsole弄匕、jvisualvm分析內(nèi)存信息(各個區(qū)如Eden、Survivor沽瞭、Old等內(nèi)存變化情況)迁匠,如果查看的是遠程服務器的JVM,程序啟動需要加上如下參數(shù):

"-Dcom.sun.management.jmxremote=true"

"-Djava.rmi.server.hostname=12.34.56.78"

"-Dcom.sun.management.jmxremote.port=18181"

"-Dcom.sun.management.jmxremote.authenticate=false"

"-Dcom.sun.management.jmxremote.ssl=false"

下圖是jconsole界面驹溃,概覽選項可以觀測堆內(nèi)存使用量城丧、線程數(shù)、類加載數(shù)和CPU占用率豌鹤;內(nèi)存選項可以查看堆中各個區(qū)域的內(nèi)存使用量和左下角的詳細描述(內(nèi)存大小亡哄、GC情況等);線程選項可以查看當前JVM加載的線程布疙,查看每個線程的堆棧信息蚊惯,還可以檢測死鎖;VM概要描述了虛擬機的各種詳細參數(shù)灵临。(jconsole功能演示)?

下圖是jvisualvm的界面截型,功能比jconsole略豐富一些,不過大部分功能都需要安裝插件儒溉。概述跟jconsole的VM概要差不多宦焦,描述的是jvm的詳細參數(shù)和程序啟動參數(shù);監(jiān)視展示的和jconsole的概覽界面差不多(CPU顿涣、堆/方法區(qū)波闹、類加載、線程)园骆;線程和jconsole的線程界面差不多舔痪;抽樣器可以展示當前占用內(nèi)存的類的排行榜及其實例的個數(shù);Visual GC可以更豐富地展示當前各個區(qū)域的內(nèi)存占用大小及歷史信息(下圖)锌唾。(jvisualvm功能演示)?

⑤分析堆轉(zhuǎn)儲快照

前面說到配置了 “-XX:+HeapDumpOnOutOfMemory” 參數(shù)可以在程序發(fā)生內(nèi)存溢出時dump出當前的內(nèi)存快照锄码,也可以用jmap命令隨時dump出當時內(nèi)存狀態(tài)的快照信息,dump的內(nèi)存快照一般是以.hprof為后綴的二進制格式文件晌涕。

可以直接用 jhat(JVM Heap Analysis Tool) 命令來分析內(nèi)存快照滋捶,它的本質(zhì)實際上內(nèi)嵌了一個微型的服務器,可以通過瀏覽器來分析對應的內(nèi)存快照余黎,比如執(zhí)行 jhat -port 9810 -J-Xmx4G /data/jvm/dumpfile_jmap.hprof 表示以9810端口啟動 jhat 內(nèi)嵌的服務器:

Reading from /Users/dannyhoo/data/jvm/dumpfile_jmap.hprof...

Dump file created Fri Aug0315:48:27CST2018

Snapshot read, resolving...

Resolving276472objects...

Chasing references, expect55dots.......................................................

Eliminating duplicate references.......................................................

Snapshot resolved.

Started HTTP server on port9810

Server is ready.

在控制臺可以看到服務器啟動了重窟,訪問?http://127.0.0.1:9810/?可以看到對快照中的每個類進行分析的結(jié)果(界面略low),下圖是我隨便選擇了一個類的信息惧财,有這個類的父類巡扇,加載這個類的類加載器和占用的空間大小扭仁,下面還有這個類的每個實例(References)及其內(nèi)存地址和大小,點進去會顯示這個實例的一些成員變量等信息:?

jvisualvm也可以分析內(nèi)存快照厅翔,在jvisualvm菜單的“文件”-“裝入”乖坠,選擇堆內(nèi)存快照,快照中的信息就以圖形界面展示出來了刀闷,如下熊泵,主要可以查看每個類占用的空間、實例的數(shù)量和實例的詳情等:?

還有很多分析內(nèi)存快照的第三方工具甸昏,比如eclipse mat顽分,它比jvisualvm功能更專業(yè),出了查看每個類及對應實例占用的空間施蜜、數(shù)量卒蘸,還可以查詢對象之間的調(diào)用鏈,可以查看某個實例到GC Root之間的鏈花墩,等等悬秉。可以在eclipse中安裝mat插件冰蘑,也可以下載獨立的版本(http://www.eclipse.org/mat/downloads.php?),我在mac上安裝后運行起來老卡死~下面是在windows上的截圖(MAT功能演示):

(3)JVM調(diào)優(yōu)經(jīng)驗

JVM配置方面村缸,一般情況可以先用默認配置(基本的一些初始參數(shù)可以保證一般的應用跑的比較穩(wěn)定了)祠肥,在測試中根據(jù)系統(tǒng)運行狀況(會話并發(fā)情況、會話時間等)梯皿,結(jié)合gc日志仇箱、內(nèi)存監(jiān)控、使用的垃圾收集器等進行合理的調(diào)整东羹,當老年代內(nèi)存過小時可能引起頻繁Full GC剂桥,當內(nèi)存過大時Full GC時間會特別長。

那么JVM的配置比如新生代属提、老年代應該配置多大最合適呢权逗?答案是不一定,調(diào)優(yōu)就是找答案的過程冤议,物理內(nèi)存一定的情況下斟薇,新生代設置越大,老年代就越小恕酸,F(xiàn)ull GC頻率就越高堪滨,但Full GC時間越短;相反新生代設置越小蕊温,老年代就越大袱箱,F(xiàn)ull GC頻率就越低遏乔,但每次Full GC消耗的時間越大。建議如下:

-Xms和-Xmx的值設置成相等发笔,堆大小默認為-Xms指定的大小盟萨,默認空閑堆內(nèi)存小于40%時,JVM會擴大堆到-Xmx指定的大锌疬帧鸯旁;空閑堆內(nèi)存大于70%時,JVM會減小堆到-Xms指定的大小量蕊。如果在Full GC后滿足不了內(nèi)存需求會動態(tài)調(diào)整铺罢,這個階段比較耗費資源。

新生代盡量設置大一些残炮,讓對象在新生代多存活一段時間韭赘,每次Minor GC 都要盡可能多的收集垃圾對象,防止或延遲對象進入老年代的機會势就,以減少應用程序發(fā)生Full GC的頻率泉瞻。

老年代如果使用CMS收集器,新生代可以不用太大苞冯,因為CMS的并行收集速度也很快袖牙,收集過程比較耗時的并發(fā)標記和并發(fā)清除階段都可以與用戶線程并發(fā)執(zhí)行。

方法區(qū)大小的設置舅锄,1.6之前的需要考慮系統(tǒng)運行時動態(tài)增加的常量鞭达、靜態(tài)變量等,1.7只要差不多能裝下啟動時和后期動態(tài)加載的類信息就行皇忿。

代碼實現(xiàn)方面畴蹭,性能出現(xiàn)問題比如程序等待、內(nèi)存泄漏除了JVM配置可能存在問題鳍烁,代碼實現(xiàn)上也有很大關系:

避免創(chuàng)建過大的對象及數(shù)組:過大的對象或數(shù)組在新生代沒有足夠空間容納時會直接進入老年代叨襟,如果是短命的大對象,會提前出發(fā)Full GC幔荒。

避免同時加載大量數(shù)據(jù)糊闽,如一次從數(shù)據(jù)庫中取出大量數(shù)據(jù),或者一次從Excel中讀取大量記錄铺峭,可以分批讀取墓怀,用完盡快清空引用。

當集合中有對象的引用卫键,這些對象使用完之后要盡快把集合中的引用清空傀履,這些無用對象盡快回收避免進入老年代。

可以在合適的場景(如實現(xiàn)緩存)采用軟引用、弱引用钓账,比如用軟引用來為ObjectA分配實例:SoftReference objectA=new SoftReference(); 在發(fā)生內(nèi)存溢出前碴犬,會將objectA列入回收范圍進行二次回收,如果這次回收還沒有足夠內(nèi)存梆暮,才會拋出內(nèi)存溢出的異常服协。

避免產(chǎn)生死循環(huán),產(chǎn)生死循環(huán)后啦粹,循環(huán)體內(nèi)可能重復產(chǎn)生大量實例偿荷,導致內(nèi)存空間被迅速占滿。

盡量避免長時間等待外部資源(數(shù)據(jù)庫唠椭、網(wǎng)絡跳纳、設備資源等)的情況,縮小對象的生命周期贪嫂,避免進入老年代寺庄,如果不能及時返回結(jié)果可以適當采用異步處理的方式等。

(4)JVM問題排查記錄案例

JVM服務問題排查?https://blog.csdn.net/jacin1/article/details/44837595

次讓人難以忘懷的排查頻繁Full GC過程?http://caogen81.iteye.com/blog/1513345

線上FullGC頻繁的排查?https://blog.csdn.net/wilsonpeng3/article/details/70064336/

【JVM】線上應用故障排查?https://www.cnblogs.com/Dhouse/p/7839810.html

一次JVM中FullGC問題排查過程?http://iamzhongyong.iteye.com/blog/1830265

JVM內(nèi)存溢出導致的CPU過高問題排查案例?https://blog.csdn.net/nielinqi520/article/details/78455614

一個java內(nèi)存泄漏的排查案例?https://blog.csdn.net/aasgis6u/article/details/54928744

(5)常用JVM參數(shù)參考:

參數(shù)說明實例

-Xms初始堆大小力崇,默認物理內(nèi)存的1/64-Xms512M

-Xmx最大堆大小斗塘,默認物理內(nèi)存的1/4-Xms2G

-Xmn新生代內(nèi)存大小,官方推薦為整個堆的3/8-Xmn512M

-Xss線程堆棧大小亮靴,jdk1.5及之后默認1M馍盟,之前默認256k-Xss512k

-XX:NewRatio=n設置新生代和年老代的比值。如:為3茧吊,表示年輕代與年老代比值為1:3朽合,年輕代占整個年輕代年老代和的1/4-XX:NewRatio=3

-XX:SurvivorRatio=n年輕代中Eden區(qū)與兩個Survivor區(qū)的比值。注意Survivor區(qū)有兩個饱狂。如:8,表示Eden:Survivor=8:1:1宪彩,一個Survivor區(qū)占整個年輕代的1/8-XX:SurvivorRatio=8

-XX:PermSize=n永久代初始值休讳,默認為物理內(nèi)存的1/64-XX:PermSize=128M

-XX:MaxPermSize=n永久代最大值,默認為物理內(nèi)存的1/4-XX:MaxPermSize=256M

-verbose:class在控制臺打印類加載信息?

-verbose:gc在控制臺打印垃圾回收日志?

-XX:+PrintGC打印GC日志尿孔,內(nèi)容簡單?

-XX:+PrintGCDetails打印GC日志俊柔,內(nèi)容詳細?

-XX:+PrintGCDateStamps在GC日志中添加時間戳?

-Xloggc:filename指定gc日志路徑-Xloggc:/data/jvm/gc.log

-XX:+UseSerialGC年輕代設置串行收集器Serial?

-XX:+UseParallelGC年輕代設置并行收集器Parallel Scavenge?

-XX:ParallelGCThreads=n設置Parallel Scavenge收集時使用的CPU數(shù)。并行收集線程數(shù)活合。-XX:ParallelGCThreads=4

-XX:MaxGCPauseMillis=n設置Parallel Scavenge回收的最大時間(毫秒)-XX:MaxGCPauseMillis=100

-XX:GCTimeRatio=n設置Parallel Scavenge垃圾回收時間占程序運行時間的百分比雏婶。公式為1/(1+n)-XX:GCTimeRatio=19

-XX:+UseParallelOldGC設置老年代為并行收集器ParallelOld收集器?

-XX:+UseConcMarkSweepGC設置老年代并發(fā)收集器CMS?

-XX:+CMSIncrementalMode設置CMS收集器為增量模式,適用于單CPU情況白指。?

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留晚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子告嘲,更是在濱河造成了極大的恐慌错维,老刑警劉巖奖地,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赋焕,居然都是意外死亡参歹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門隆判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬庇,“玉大人,你說我怎么就攤上這事侨嘀〕敉欤” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵飒炎,是天一觀的道長埋哟。 經(jīng)常有香客問我,道長郎汪,這世上最難降的妖魔是什么赤赊? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮煞赢,結(jié)果婚禮上抛计,老公的妹妹穿的比我還像新娘。我一直安慰自己照筑,他們只是感情好吹截,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凝危,像睡著了一般波俄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛾默,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天懦铺,我揣著相機與錄音,去河邊找鬼支鸡。 笑死冬念,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牧挣。 我是一名探鬼主播急前,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瀑构!你這毒婦竟也來了裆针?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎据块,沒想到半個月后码邻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡另假,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年像屋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边篮。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡己莺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戈轿,到底是詐尸還是另有隱情凌受,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布思杯,位于F島的核電站胜蛉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏色乾。R本人自食惡果不足惜誊册,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暖璧。 院中可真熱鬧案怯,春花似錦、人聲如沸澎办。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局蚀。三九已至麦锯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琅绅,已是汗流浹背离咐。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奉件,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓昆著,卻偏偏與公主長得像县貌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凑懂,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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