JAVA GUI 監控工具 JConsole,Jmc,VisualVm,JProfiler

現實企業級 Java 開發中,有時候我們會碰到下面這些問題:
OutOfMemoryError,內存不足
內存泄露
線程死鎖
鎖爭用(Lock Contention)
Java 進程消耗 CPU 過高

jvm 有著非常棒的小塊內存虛擬化技術,這會讓你產生一種擁有無限內存的錯覺感,其實它的開銷非常大。有時候jvm 需要找出此刻堆上數據是如何被使用的,并把剩余的空間擴大——這就是垃圾回收。產生這種情況的原因是,jvm 實際獲得的物理內存是有限的,因此需要在不被使用時進行內存回收和復用。在一
些時間敏感的應用中,比如交易系統和通信程序,這些暫停是不能容忍的。有很多 GC 調優方法可以避免這種暫停發生。貌似上面的討論已經跑題了。讓 GC 變少的
方法當然是盡量減少分配內存。

有時候,你希望找出在你的程序中哪些地方導致了內存分配的壓力。引起這種壓力的原因有很多種。最普通的一種情況可能是jvm需要經常GC,并且時間遠超過你認為的合理值。

這些問題在日常開發中可能被很多人忽視(比如有的人遇到上面的問題只是重啟服務器或者調大內存,而不會深究問題根源),跟蹤 Java 應用程序瓶頸來源一直以來都是很麻煩的。當應用程序性能受到損害時,我們必須要通過一些方法來定位問題的所在,剔除安全隱患,下面就介紹一些可以幫助我我們監控 Java 信息圖形化工具。

JAVA.png

一、JConsole

1、簡介

JConsole 是一個內置 Java 性能分析器,可以從命令行或在 GUI shell 中運行,從 Java 5 開始 引入了 JConsole。您可以輕松地使用 JConsole、來監控 Java 應用程序性能和跟蹤 Java 中的代碼。

使 JDK 在 PATH 上,運行 jconsole 即可。當分析工具彈出時(取決于正在運行的 Java 版本以及正在運行的 Java 程序數量),可能會出現一個對話框,要求輸入一個進程的 URL 來連接,也可能列出許多不同的本地 Java 進程(有時包含 JConsole 進程本身)來連接。如圖所示:

JConsle1.png

想分析哪個程序就雙擊哪個進程,然后選擇”insercure“就會連接上了。

2、設置 JAVA 程序運行時可以被 JConsolse 連接分析

本地程序(相對于開啟JConsole的計算機),無需設置任何參數就可以被本地開啟的JConsole連接(Java SE 6開始無需設置,之前還是需要設置運行時參數 -Dcom.sun.management.jmxremote ,啟動 JMX 服務)
無認證連接 (下面的設置表示:連接的端口為8099、無需認證就可以被連接)

|

1

2

3

4

5

|

-Dcom.sun.management.jmxremote \

-Dcom.sun.management.jmxremote.port=8099 \

-Dcom.sun.management.jmxremote.authenticate=``false \

-Dcom.sun.management.jmxremote.ssl=``false \

-Djava.rmi.server.``hostname``=IP

|

JMX:Java Management Extensions ,即 Java 管理擴展 , 是一個為應用程序、設備、系統等植入管理功能的框架。 JMX 可以跨越一系列異構操作系統平臺、系統體系結構和 網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用 。

-Dcom.sun.management.jmxremote 可以不加,默認值是 ture;

-Dcom.sun.management.jmxremote.port 是端口號,隨便設置一個就可以了;

-Dcom.sun.management.jmxremote.ssl 是否啟動 ssl 連接,默認值是 true,沒有配置ssl證書就設置為 false 也可是訪問;

-Dcom.sun.management.jmxremote.authenticate 是否啟動身份驗證,默認值是 true,默認的驗證文件在 ${JAVA_HOME}/jre/lib/management/ 下,可以用 -Dcom.sun.management.jmxremote. access.file 與 -Dcom.sun.management.jmxremote. password.file 來指定配置用戶訪問權限文件與配置用戶信息的文件位置(包括用戶名和密碼),如果不需要配置訪問用戶名及密碼,設置為 false 就可以了,

jmxremote.access 、jmxremote.password 這個文件最小權限要設置為 600,組和其它用戶沒有任何權限,否則會禁止訪問;

-Djava.rmi.server.hostname 該選項是設置訪問地址的,必須設置,設置為本機 IP 或 主機名,如果設置為 127.0.0.1,那么遠程主機就無法訪問了。

詳細的安全設置參數,請參考:http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html#gden

3、JConsole 如何連接遠程機器的 JAVA 程序

|

1

2

3

4

5

6

7

8

9

10

|

用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]

-interval 將更新間隔設置為 n 秒 (默認值為 4 秒)

-notile 初始不平鋪窗口 (對于兩個或多個連接)

-pluginpath 指定 jconsole 用于查找插件的路徑

-version 輸出程序版本

connection = pid || host:port || JMX URL (service:jmx:<協議>:``//``...)

pid 目標進程的進程 ID

host 遠程主機名或 IP 地址

port 遠程連接的端口號

-J 指定運行 jconsole 的 Java 虛擬機的輸入參數

|

寫一個簡單的一直運行的 Java 程序,運行在某臺機器上如 (172.16.100.253),也可用 Tomcat 測試

|

1

|

java -``cp . -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.managent.jmxremote.authenticate=``false -Dcom.sun.management.jmxremote.ssl=``false -Djava.rmi.server.``hostname``=172.16.100.253 JConsoleTest

|

在另外一臺機器上進行連接,也可以直接使用命令:

|

1

|

jconsole 172.16.100.253:8099

|

也可以在已經打開的 JConsole 界面操作 連接->新建連接->選擇遠程進程->輸入遠程主機IP和端口號->點擊“連接”,如圖:

JConsle2.png

然后就會進入分析界面

(1)性能分析

下面說說如何分析,如何使用這六個標簽

Overview(概述): Displays overview information about the Java VM and monitored values.
Memory(內存): 顯示內存使用信息
Threads(線程): 顯示線程使用信息
Classes(類): 顯示類裝載信息
VM Sumary(VM摘要):顯示java VM信息
MBeans: 顯示 MBeans.

(2)概述

JConsle3.png

概述中將各個時間資源使用情況繪制成圖表顯示,不過值得一提的是對著圖點擊右鍵可以保存數據到 CSV 文件,所有圖都可以導成 CVS 文件,以后可以使用其他工具來分析這些數據,。

(3)內存

JConsle4.png

這個比較有價值,參看堆內存,非堆內存,內存池的狀況總體內存的分配和使用情況以及不同的 GC 進行垃圾回收的次數和時間。可以手動進行 GC 查看內存變化。在分析 JAVA 內存問題進行調優時候非常有用,你要學習 JVM 內存模型,之后會發現這里的每個值都具有意義。 GC 的算法和參數對性能有顯著的影響,注意垃圾回收次數、時間、以及 partial GC 和 full GC,調整你所使用的不同 GC 和以及各個 GC 下的參數,然后在這個視圖下觀察,以得到好的性能。
這里貼一下 Java HotSpot VM garbage collector 下generational GC 的各代的劃分圖:

GC.png

關于GC,可以參考:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

(4)線程

JConsle5.png

左下角顯示所有的活動線程(如果線程過多,可以在下面的過濾欄中輸入字符串過濾出你想要觀察的線程)。點擊某個顯示會顯示這個線程的名稱、狀態、阻塞和等待的次數、堆棧的信息。
統計圖顯示的是線程數目的峰值(紅色)和當前活動的線程(藍色)。
另外下面有個按鈕“檢測到死鎖”,有時候會有用處。

(5)類

JConsle6.png

這個沒什么可解釋的了。

(6)VM摘要

JConsle7.png

這里可以看到,操作系統,內存,線程等全部信息,方便我們調整系統資源的分配。

(7)MBean

JConsle8.png

這里可以有一些額外的操作,方便調試代碼。

(8)插件

|

1

|

jconsole -pluginpath ``/usr/local/jdk1``.7.0_79``/demo/management/JTop/JTop``.jar

|

JConsle9.png

|

1

|

JTop 插件在 JDK 的 demo 包中,還有許多其它的樣例,該插件的功能一目了然。

|

二、Jmc

1、簡介

Oracle 發布了 Java 7 update 40,該修訂版增加了一些重要的新特性,包括 JVM 監控工具、任務控制,Java applet 規則集、Web Start 應用程序以及大量的 bug 修復。新增的一個非常好用的工具,就是 Java Mission Control(JMC 任務控制工具) 。 JRockit Misson Control 用戶應該會對 mission control 的很多功能十分熟悉,JRockit 也是一款很棒的工具。Java 任務控制(JMC)是一個產品時間工具套件,它的根源是 JRockit JVM 工具。該工具套件的目的是提供不張揚的 Java 監控和管理,適合在開發和產品環境中使用。JMC 與 Java Flight Recorder 一起工作,適用于 HotSpot JVM,用來記錄核心數據和事件。它是一個調優工具,一旦出現問題,這些數據就可以用來分析。

該工具套件由三個主要的組件組成:Java 進程瀏覽器、JMX 控制臺和 Java Flight 記錄器。
Java 進程瀏覽器:允許用戶列出并連接到本地和遠程運行的Java應用程序。它能夠使用 Java發現協議(JDP)自動地發現本地和遠程運行的 Java 進程。
JMX 控制臺:能夠通過 JMX 接口管理并監控 JDK。它提供了實時集合、堆使用情況、CPU 負載以及其他通過 MBeans 暴露的和在 MBean 服務器中注冊的信息。
Java Flight 記錄器:提供了一種從操作系統層、JVM 和 Java 應用程序層收集事件的方式。收集的事件包括線程延時事件,例如休眠(sleep)、等待(wait)、鎖競爭、I/O、GC 和方法分析。Oracle 估計對大多數應用程序而言運行 Flight 記錄器的性能開銷大約在 2% 左右。

2、Jmc 使用方法

打開以后界面如下:

Jmc1.png

Jmc 既可以連接本地 Java 程序,也可以連接本地 Java 程序,遠端要開啟 jmxremote 訪問。本地程序在左側想查看的的程序名那里,右鍵點擊啟動 JMX 控制臺就可以了。遠程訪問在左側空白處右鍵點擊新建連接,如圖填寫好主機和端口,這里的主機和端口就是我們前面在遠程服務器配置的服務器 IP 和端口。

Jmc2.png
Jmc3.png

創建完成之后我們就能看到服務器的概要信息了。通過下面的選項卡就可以切換顯示其它的詳細的信息了。

概覽:

Jmc4.png

MBean 瀏覽器:

Jmc5.png

觸發器:

Jmc6.png

系統:

Jmc7.png

內存:

Jmc8.png

線程:

Jmc9.png

診斷命令:

Jmc10.png

Jmc 還可以安裝一些插件,增加一些功能。所有的功能都可以點擊右上角的 "? " ,會通過瀏覽器訪問本地的幫助文件。

飛行記錄器使用前,需要在 Java 程序啟動前加 2 個參數“ -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ”,如果沒有添加,無法使用飛行記錄器飛行記錄器啟動后,可以記錄服務器一段時間內的運行狀況,還可導成文件備份,需要 Java 程序啟動前在加一個參數“ -XX:FlightRecorderOptions=defaultrecording=true”才可以導出,方便隨時分析,這個是查找服務器性能的利器。

Jmc11.png

飛行記錄器記錄成功之后可以看到下面的一些信息:

Jmc12.png

Jmc 很豐富、很強大,其他功能可以自行研究。

三、VisualVm

1、簡介

VisualVM 是 Netbeans 的 profile 子項目,自從JDK 6 Update 7以后已經作為JDK的一部分(java啟動時不需要特定參數,監控工具為在${JAVA_HOME}/bin/jvisualvm),是一款免費的Java虛擬機監控和性能分析工具。能夠監控線程,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)。

jvisualvm 從界面上看還是比較簡潔的,左邊是樹形結構,自動顯示當前本機所運行的 Java 程序,還可以添加遠程的 Java VM,其中括號里面的 PID 指的是進程 ID。OverView 界面顯示 VM 啟動參數以及該 VM 對應的一些屬性。Monitor 界面則是監控 Java 堆大小,Permgen 大小,Classes 和線程數量。

該工具提供了一個圖形界面窗口,并且可以直觀的了解Java應用程序的運行時信息。jvisualvm 集成了許多工具,比如像 jmp、jinfo、jstat、jstack、JConsole 等。它通過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運行時獲得實時數據,從而進行動態的性能分析。同時,它能自動選擇更快更輕量級的技術盡量減少性能分析對應用程序造成的影響,提高性能分析的精度。

2、安裝插件并啟動 Java VisualVM

配置好 JDK 環境變量,執行 jvisualvm 就可以打開軟件了,在 VisualVM 插件中心安裝插件安裝步驟如下 :
從主菜單中選擇“工具”>“插件”,在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”,逐步完成插件安裝程序。這些插件都是 .nbm 文件,也可以提前下好,在已下載標簽中點擊“添加插件按鈕”,選擇已下載的插件文件 (.nbm) 并打開,逐步完成插件安裝程序。

VisualVM1.png

安裝好插件后,相應的功能就可以使用了。

3、通過 Java VisualVM 連接到服務器監控 Java 程序

監控本地進程,雙擊左側本地下邊的進程名字就可以查看監控信息了。

接下來就是遠程監控 Java 程序了,默認是使用 Jstatd 連接到遠程主機的,所以在遠程主機上,必須要一直運行著 jstatd 守護程序,啟動方法可以參考上一篇文章。

右鍵點擊遠程-添加遠程主機-輸入主機ip地址,確認提交后即可看到相應的遠程主機和在上面運行的 Java 程序,連接成功后應該會顯示 Jstatd 及其 PID。

VisualVM2.png

通過以上方式連接服務器發現一個問題,不能監控 CPU ,提示不受此 JVM 支持,所以我們還是要使用 JMX 方式來連接遠程主機,如果遠端服務開啟了 JMX,只需在遠程主機那里右鍵添加一個 JMX 連接就可以了。連接成功,現在我們可以遠程監控服務器性能。

VisualVM3.png
VisualVM4.png

在上圖中可以看到cpu利用率和垃圾回收活動(這個在分析tomcat性能時也很重要)。然后是堆棧使用情況。下面是類的使用情況,最后一個是線程活動情況。

點擊線程標簽可以看到:

VisualVM5.png

上圖可以非常清晰的看到線程活動情況,那些線程正在執行,哪些線程正在等待中,以及執行完畢的線程等。JDK 1.7 中的這個工具線程監控頁面功能減少了,只剩時間線了(Timeline),JDK 1.6 內置的工具,還表(tab)、詳細信息(Details)功能,可以右鍵選擇查看單個進程的詳細的狀態信息。部分監控頁還可以 Dump 出來狀態文件保存下來,然后分析,如將 Heap Dump 出的遠程文件 *.hprof ,拷貝到本地導入后分析。

加載后的 Dump 分析:

VisualVM6.png

這可是一個性能分析利器哦!暫時就介紹這些功能。

四、JProfiler

1、簡介

JProfiler 是一個商業授權的 Java 剖析工具,主要用于檢查和跟蹤系統(限于Java開發的)的性能的工具,它是德國 ej-technologies 公司開發的一款全功能的 Java 剖析工具(profiler),專用于分析 J2SE 和 J2EE 應用程序。它把CPU、執行緒和內存的剖析組合在一個強大的應用中。 JProfiler 可提供許多 IDE 整合和應用服務器整合用途。JProfiler 直覺式的 GUI 讓你可以找到效能瓶頸、抓出內存漏失(memory leaks)、并解決執行緒的問題。它讓你得以對 heap walker 作資源回收器的 root analysis,可以輕易找出內存漏失;heap 快照(snapshot)模式讓未被參照(reference)的對象、稍微被參照的對象、或在終結(finalization)隊列的對象都會被移除;整合精靈以便剖析瀏覽器的 Java 外掛功能。

2、安裝

下載地址:http://www.ej-technologies.com/download/jprofiler/files 目前最新版是 Version: 9.0.3 (2015-09-16)

這里使用 Version:8.0.7 版本來演示安裝,低版本的功能已經滿足我的的需求了,而且也破解也方便。對與 Linux 系統,官網提供了 3 種 安裝文件,分別是 Setup Executable、RPM 和 TAR.GZ,我這里下載的是 Setup Executable 版本,直接執行就可以安裝了。

|

1

2

3

|

wget http:``//download-aws``.ej-technologies.com``/jprofiler/jprofiler_linux_8_0_7``.sh

chmod +x jprofiler_linux_8_0_7.sh

.``/jprofiler_linux_8_0_7``.sh -c

|

按照提示來安裝就可以了,提示都很簡單,不在多說,默認安裝路徑在 /opt/jprofiler8 下。

注意,這里的 -c 意思是用字符方式來安裝,默認是以圖形化方式安裝的。

3、配置使用

(1)運行 JProfiler,第一次打開會有向導,忽略它;

JProfiler1.png

(2)選擇 Session->Integration Wizard->New Remote Integratation;

也可以選擇其它幾個連接方式也可以,按照向導一步一步操作就可以了。

JProfiler2.png

(3) 選擇 On a remote computer;Platform of remote computer 選擇 Linux x86/AMD 64;

JProfiler3.png

(4)選擇服務器的 JDK 環境,這里是:Sun,1.7.0,hotspot;

服務器上可能安裝了多個 JAVA 版本,所選的 JVM 提供商和版本,一定要選應用程序啟動時所用的。

JProfiler4.png

(5)選擇啟動模式:這里選第一種 wait for a connection from the jprofiler GUI;

JProfiler5.png

關于上邊顯示的3個選項做一下說明:

Wait for a connection from the Jprofiler GUI,此模式為,在啟動 Java 程序時,需要等 Jprofiler 連接后才能啟動,開發人員經常使用此項;

Startup immediately,connect later with the JProfiler GUI,此模式下, Java 程序獨立啟動,Jprofiler 隨時可以連接;

Profile offline,JProfiler GUI cannot connect,此模式為離線模式,生成相關記錄文件事后分析;

(6)輸入遠程服務器 IP;

JProfiler6.png

(7)輸入遠程服務器上的 JProfiler 的安裝路徑,如 /opt/jprofiler8;

在連接遠程機器時,遠程機器也是需要安裝 JProfiler 的,2個 JProfiler 版本要保持一致。

JProfiler7.png

(8)會提示 JProfiler 的端口,默認是 8849,可以不用修改,直接下一步就可以了;

JProfiler8.png

(9)這里會列出需要在服務器端做的配置;

JProfiler9.png

將上述參數 -agentpath:/opt/jprofiler8/bin/linux-x64/libjprofilerti.so=port=8849 添加到遠程主機的啟動參數中,如監控 Tomcat 服務,添加到 $CATALINA_OPTS 中,啟動服務時,在日志中可以看到,系統會一直處于等待狀態,直到 JProfiler 連接上Tomcat,程序才會繼續進行。

|

1

2

3

4

5

6

7

8

9

10

11

|

JProfiler> Protocol version 39

JProfiler> Using JVMTI

JProfiler> JVMTI version 1.1 detected.

JProfiler> 64-bit library

JProfiler> Listening on port: 8849.

JProfiler> Instrumenting native methods.

JProfiler> Can retransform classes.

JProfiler> Can retransform any class.

JProfiler> Native library initialized

JProfiler> VM initialized

JProfiler> Waiting ``for a connection from the JProfiler GUI ...

|

(10)啟動 JProfiler 查看監控數據

點擊 JProfiler 菜單 session>start center>Open Session

Available session configurations中列出了剛才配置的連接,選中使用就OK了!

Initial Profiling Settings 選擇默認的,一般我們都是要查看所有項。

JProfiler10.png
JProfiler11.png
JProfiler12.png
JProfiler13.png

JProfiler 可以通過時時的監控系統的內存使用情況,隨時監視垃圾回收,線程運行狀況等手段,從而很好的監視 JVM 運行情況及其性能。

4、破解注冊

JProfiler8 注冊碼序列號

按默認選擇“Single or evaluation license”

Name 和 Company 隨意
————————————————————–
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620
L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257
L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038
L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215
L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674
————————————————————–
L-Larry_Lau@163.com#7009-14frku31ynzpfr#20176
L-Larry_Lau@163.com#49604-1jfe58we9gyb6#5814
L-Larry_Lau@163.com#25531-1qcev4yintqkj#23927
L-Larry_Lau@163.com#96496-1qsu1lb1jz7g8w#23479
L-Larry_Lau@163.com#20948-11amlvg181cw0p#171159

注冊碼前面的郵箱部分為注冊郵箱,破解后,就不限制使用時間了。

5、IDE 集成

JProfiler 還可以和 IDE 工具集成,邊調試代碼,邊查看系統運行情況。當 JProfiler 與 IDE (eclipse)集成后,不需要配session,可以直接在 IDE 中調用。安裝前關閉 eclipse,按照安裝向導進行就可以了。

JProfiler 監控要占用一定的系統資源,所以一般情況下不要用于性能測試。實際操作中,最好有開發人員來觀察分析視圖,跟蹤具體的代碼問題,從而針對性的修改某部分代碼,優化程序。JProfiler 功能很多,這里就不細說了,在使用過程中,一點一點摸索吧。

轉自:http://blog.chopmoon.com/favorites/226.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容