用java獲取JVM的CPU占用率啃奴、內(nèi)存占用率、線程數(shù)及服務(wù)器的網(wǎng)口吞吐率雄妥、磁盤讀寫速率的實現(xiàn)

import java.io.BufferedReader;import java.io.IOException;

import java.io.InputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.lang.management.ManagementFactory;import java.lang.management.RuntimeMXBean;import java.util.Formatter;import java.util.StringTokenizer;import java.util.Timer;import java.util.TimerTask;

import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;

import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.serializer.SerializerFeature;import com.nufront.euht.model.SysPerformInfo;import com.nufront.euht.service.api.sys.SysPerformInfoServiceI;import com.nufront.euht.util.UuidUtil;import com.sun.management.OperatingSystemMXBean;

/** * 網(wǎng)管信息信息信息采集類 *? * @author liming.cen * @date 2017-4-11 */@Servicepublic class SysInfoAcquirerService {

private static final int CPUTIME = 5000; /** * 網(wǎng)管進(jìn)程信息采集周期(注意:PERIOD_TIME 一定要大于 SLEEP_TIME ) */ private static final int PERIOD_TIME = 1000 * 60 * 15; /** * 此類中Thread.sleep()里的線程睡眠時間 */ private static final int SLEEP_TIME = 1000 * 60 * 9; private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; private String isWindowsOrLinux = isWindowsOrLinux(); private String pid = ""; private Timer sysInfoGetTimer = new Timer("sysInfoGet"); @Autowired private SysPerformInfoServiceI sysPerformInfoService;

public Logger log = Logger.getLogger(SysInfoAcquirerService.class);

/** * 初始化bean的時候就立即獲取JVM進(jìn)程的PID及執(zhí)行任務(wù) * * @return */ @PostConstruct public void init() { if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows getJvmPIDOnWindows(); } else { getJvmPIDOnLinux(); } sysInfoGetTimer.schedule(new SysInfoAcquirerTimerTask(), 10 * 1000, PERIOD_TIME); }

/** * 判斷是服務(wù)器的系統(tǒng)類型是Windows 還是 Linux * * @return */ public String isWindowsOrLinux() { String osName = System.getProperty("os.name"); String sysName = ""; if (osName.toLowerCase().startsWith("windows")) { sysName = "windows"; } else if (osName.toLowerCase().startsWith("linux")) { sysName = "linux"; } return sysName; }

/** * 獲取JVM 的CPU占用率(%) * * @return */ public String getCPURate() { String cpuRate = ""; if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows cpuRate = getCPURateForWindows(); } else { cpuRate = getCPURateForLinux(); } return cpuRate; }

/** * windows環(huán)境下獲取JVM的PID */ public void getJvmPIDOnWindows() { RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); pid = runtime.getName().split("@")[0]; log.info("PID of JVM:" + pid); }

/** * linux環(huán)境下獲取JVM的PID */ public void getJvmPIDOnLinux() { String command = "pidof java"; BufferedReader in = null; Process pro = null; try { pro = Runtime.getRuntime().exec(new String[] { "sh", "-c", command }); in = new BufferedReader(new InputStreamReader(pro.getInputStream())); StringTokenizer ts = new StringTokenizer(in.readLine()); pid = ts.nextToken(); log.info("PID of JVM:" + pid); } catch (IOException e) { e.printStackTrace(); } }

/** * 獲取JVM的內(nèi)存占用率(%) * * @return */ public String getMemoryRate() { String memRate = ""; if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows memRate = getMemoryRateForWindows();// 查詢windows系統(tǒng)的cpu占用率 } else { memRate = getMemoryRateForLinux();// 查詢linux系統(tǒng)的cpu占用率 } return memRate; }

/** * 獲取JVM 線程數(shù) * * @return */ public int getThreadCount() { int threadCount = 0; if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows threadCount = getThreadCountForWindows();// 查詢windows系統(tǒng)的線程數(shù) } else { threadCount = getThreadCountForLinux();// 查詢linux系統(tǒng)的線程數(shù) } return threadCount; }

/** * 獲取磁盤讀寫速率(MB/s) * * @return */ // public String getDiskAccess() { // TODO:待完成 // String diskAccess = ""; // if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows // // diskAccess = getDiskAccessForWindows(); // 查詢windows系統(tǒng)的磁盤讀寫速率 // } else { // diskAccess = getDiskAccessForLinux(); // 查詢linux系統(tǒng)的磁盤讀寫速率 // } // return diskAccess; // }

/** * 獲取網(wǎng)口吞吐量(MB/s) * * @return */ public String getNetworkThroughput() { String throughput = ""; if (isWindowsOrLinux.equals("windows")) { // 判斷操作系統(tǒng)類型是否為:windows throughput = getNetworkThroughputForWindows(); // 查詢windows系統(tǒng)的磁盤讀寫速率 } else { throughput = getNetworkThroughputForLinux(); // 查詢linux系統(tǒng)的磁盤讀寫速率 } return throughput; }

/** * 獲取Windows環(huán)境下網(wǎng)口的上下行速率 * * @return */ public String getNetworkThroughputForWindows() { Process pro1 = null; Process pro2 = null; Runtime r = Runtime.getRuntime(); BufferedReader input = null; String rxPercent = ""; String txPercent = ""; JSONObject jsonObject = new JSONObject(); try { String command = "netstat -e"; pro1 = r.exec(command); input = new BufferedReader(new InputStreamReader(pro1.getInputStream())); String result1[] = readInLine(input, "windows"); Thread.sleep(SLEEP_TIME); pro2 = r.exec(command); input = new BufferedReader(new InputStreamReader(pro2.getInputStream())); String result2[] = readInLine(input, "windows"); rxPercent = formatNumber((Long.parseLong(result2[0]) - Long.parseLong(result1[0])) / (float) (1024 * 1024 * (SLEEP_TIME / 1000))); // 上行速率(MB/s) txPercent = formatNumber((Long.parseLong(result2[1]) - Long.parseLong(result1[1])) / (float) (1024 * 1024 * (SLEEP_TIME / 1000))); // 下行速率(MB/s) input.close(); pro1.destroy(); pro2.destroy(); } catch (Exception e) { log.error(e.getMessage()); } jsonObject.put("rxPercent", rxPercent); // 下行速率 jsonObject.put("txPercent", txPercent); // 上行速率 return JSON.toJSONStringWithDateFormat(jsonObject, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteMapNullValue); }

/** * 獲取Linux環(huán)境下網(wǎng)口的上下行速率 * * @return */ public String getNetworkThroughputForLinux() { Process pro1 = null; Process pro2 = null; Runtime r = Runtime.getRuntime(); BufferedReader input = null; String rxPercent = ""; String txPercent = ""; JSONObject jsonObject = new JSONObject(); try { String command = "watch ifconfig"; pro1 = r.exec(command); input = new BufferedReader(new InputStreamReader(pro1.getInputStream()));

String result1[] = readInLine(input, "linux"); Thread.sleep(SLEEP_TIME); pro2 = r.exec(command); input = new BufferedReader(new InputStreamReader(pro2.getInputStream())); String result2[] = readInLine(input, "linux"); rxPercent = formatNumber((Long.parseLong(result2[0]) - Long.parseLong(result1[0])) / (float) (1024 * 1024 * (SLEEP_TIME / 1000))); // 下行速率(MB/s) txPercent = formatNumber((Long.parseLong(result2[1]) - Long.parseLong(result1[1])) / (float) (1024 * 1024 * (SLEEP_TIME / 1000))); // 上行速率(MB/s) input.close(); pro1.destroy(); pro2.destroy(); } catch (Exception e) { log.error(e.getMessage()); } jsonObject.put("rxPercent", rxPercent); // 下行速率 jsonObject.put("txPercent", txPercent); // 上行速率 return JSON.toJSONStringWithDateFormat(jsonObject, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteMapNullValue); }

/** * 獲取windows環(huán)境下JVM的cpu占用率 * * @return */ public String getCPURateForWindows() { try { String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe? process " + "? get Caption,CommandLine,KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取進(jìn)程信息 long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); if (c0 != null && c1 != null) { long idletime = c1[0] - c0[0]; long busytime = c1[1] - c0[1]; long cpuRate = PERCENT * (busytime) / (busytime + idletime); if (cpuRate > 100) { cpuRate = 100; } else if (cpuRate < 0) { cpuRate = 0; } return String.valueOf(PERCENT * (busytime) / (busytime + idletime));

} else { return "0.0"; } } catch (Exception ex) { ex.printStackTrace(); return "0.0"; } }

/** * 獲取linux環(huán)境下JVM的cpu占用率 * * @return */ public String getCPURateForLinux() { InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTokenizer tokenStat = null; String user = ""; String linuxVersion = System.getProperty("os.version"); try { System.out.println("Linux版本: " + linuxVersion);

Process process = Runtime.getRuntime().exec(new String[] { "sh", "-c", "top -b -p " + pid }); try { // top命令默認(rèn)3秒動態(tài)更新結(jié)果信息最蕾,讓線程睡眠5秒以便獲取最新結(jié)果 Thread.sleep(CPUTIME); is = process.getInputStream(); } catch (InterruptedException e) { e.printStackTrace(); } isr = new InputStreamReader(is); brStat = new BufferedReader(isr);

if (linuxVersion.equals("2.4")) { brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); tokenStat.nextToken(); user = tokenStat.nextToken(); tokenStat.nextToken(); String system = tokenStat.nextToken(); tokenStat.nextToken(); String nice = tokenStat.nextToken();

System.out.println(user + " , " + system + " , " + nice);

user = user.substring(0, user.indexOf("%")); system = system.substring(0, system.indexOf("%")); nice = nice.substring(0, nice.indexOf("%"));

float userUsage = new Float(user).floatValue(); float systemUsage = new Float(system).floatValue(); float niceUsage = new Float(nice).floatValue(); return String.valueOf((userUsage + systemUsage + niceUsage) / 100); } else { brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); String userUsage = tokenStat.nextToken(); // 用戶空間占用CPU百分比 user = userUsage.substring(0, userUsage.indexOf("%")); process.destroy(); }

} catch (IOException ioe) { System.out.println(ioe.getMessage()); freeResource(is, isr, brStat); return "100"; } finally { freeResource(is, isr, brStat); } return user; // jvm cpu占用率 }

/** * 獲取Linux環(huán)境下JVM的內(nèi)存占用率 * * @return */ public String getMemoryRateForLinux() { Process pro = null; Runtime r = Runtime.getRuntime(); String remCount = ""; try { String command = "top -b? -n 1 -H -p" + pid; pro = r.exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(pro.getInputStream())); in.readLine(); in.readLine(); in.readLine(); in.readLine(); in.readLine(); in.readLine(); in.readLine(); StringTokenizer ts = new StringTokenizer(in.readLine()); int i = 1; while (ts.hasMoreTokens()) { i++; ts.nextToken(); if (i == 10) { remCount = ts.nextToken(); } } in.close(); pro.destroy(); } catch (Exception e) { log.error(e.getMessage()); } return remCount; }

/** * 獲取windows環(huán)境下jvm的內(nèi)存占用率 * * @return */ public String getMemoryRateForWindows() { String command = "TASKLIST /NH /FO CSV /FI \"PID EQ " + pid + " \""; String remCount = ""; // jvm物理內(nèi)存占用量 BufferedReader in = null; String result = ""; try { Process pro = Runtime.getRuntime().exec(command); in = new BufferedReader(new InputStreamReader(pro.getInputStream())); StringTokenizer ts = new StringTokenizer(in.readLine(), "\""); int i = 1; while (ts.hasMoreTokens()) { i++; ts.nextToken(); if (i == 9) { remCount = ts.nextToken().replace(",", "").replace("K", "").trim(); } } long physicalJvmMem = Long.parseLong(remCount) / 1024; // jvm物理內(nèi)存占用量(MB) OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); long physicalTotal = osmxb.getTotalPhysicalMemorySize() / (1024 * 1024); // 獲取服務(wù)器總物理內(nèi)存(MB) result = formatNumber(physicalJvmMem / (float) physicalTotal); if (Float.parseFloat(result) > 1) { // 占用率最多只能是100% result = "1"; } else if (Float.parseFloat(result) < 0) { result = "0"; } in.close(); pro.destroy(); } catch (Exception e) { log.error("getThreadCountForWindows()報異常:" + e); } return String.valueOf((Float.parseFloat(result) * 100)); }

/** * 獲取linux磁盤讀寫速率 * * @return */ // public String getDiskAccessForLinux() { // Process pro = null; // Runtime r = Runtime.getRuntime(); // String command = "time dd if=/dev/zero of=/temp.log bs=1024k count=1000"; // // 讀取和寫入1G數(shù)據(jù) // BufferedReader in = null; // float result = 0.0f; // try { // pro = r.exec(new String[] { "sh", "-c", command }); // // pro.getInputStream()取不到結(jié)果內(nèi)容,反而是getErrorStream()可以取到值 // in = new BufferedReader(new InputStreamReader(pro.getErrorStream())); // in.readLine(); // in.readLine(); // if (getLocale().indexOf("zh") != -1) { // 中文語言環(huán)境 // StringTokenizer ts = new StringTokenizer(in.readLine(), "老厌,"); // ts.nextToken(); // ts.nextToken(); // result = Float.parseFloat(ts.nextToken().split(" ")[0]); // System.out.println("中文環(huán)境"); // } else { // 英文語言環(huán)境 // StringTokenizer ts = new StringTokenizer(in.readLine()); // ts.nextToken(); // ts.nextToken(); // ts.nextToken(); // ts.nextToken(); // ts.nextToken(); // ts.nextToken(); // ts.nextToken(); // result = Float.parseFloat(ts.nextToken().split(" ")[0]); // System.out.println("英文環(huán)境"); // } // r.exec("rm -f /temp.log"); // 將生成的文件刪掉 // in.close(); // pro.destroy(); // } catch (IOException e) { // System.out.println(e.getMessage()); // } // return String.valueOf(result); // }

/** * 獲取Linux服務(wù)器的語言環(huán)境 * * @return */ public String getLocale() { Process pro = null; Runtime r = Runtime.getRuntime(); String command = "locale"; BufferedReader in = null; StringTokenizer ts = null; try { pro = r.exec(command); in = new BufferedReader(new InputStreamReader(pro.getInputStream())); ts = new StringTokenizer(in.readLine()); in.close(); pro.destroy(); } catch (IOException e) { System.out.println(e.getMessage()); } return ts.nextToken(); }

/** * 獲取Linux環(huán)境下JVM的線程數(shù) * * @return */ public int getThreadCountForLinux() { Process pro = null; Runtime r = Runtime.getRuntime(); String command = "top -b -n 1 -H -p " + pid; BufferedReader in = null; int result = 0; try { pro = r.exec(new String[] { "sh", "-c", command }); in = new BufferedReader(new InputStreamReader(pro.getInputStream())); in.readLine(); StringTokenizer ts = new StringTokenizer(in.readLine()); ts.nextToken(); result = Integer.parseInt(ts.nextToken()); in.close(); pro.destroy(); } catch (IOException e) { e.printStackTrace(); } return result;

}

/** * 獲取Windows環(huán)境下JVM的線程數(shù) * * @return */ public int getThreadCountForWindows() { String command = "wmic process " + pid + "? list brief"; int count = 0; BufferedReader in = null; try { Process pro = Runtime.getRuntime().exec(command); in = new BufferedReader(new InputStreamReader(pro.getInputStream())); // testGetInput(in); in.readLine(); in.readLine(); StringTokenizer ts = new StringTokenizer(in.readLine()); int i = 1;

while (ts.hasMoreTokens()) { i++; ts.nextToken(); if (i == 5) { count = Integer.parseInt(ts.nextToken()); } } in.close(); pro.destroy(); } catch (Exception e) { log.error("getThreadCountForWindows()報異常:" + e); } return count; }

private void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { try { if (is != null) is.close(); if (isr != null) isr.close(); if (br != null) br.close(); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } }

/** * * 讀取CPU信息 * * @param proc * @return * */ private long[] readCpu(final Process proc) { long[] retn = new long[2]; try { proc.getOutputStream().close(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line = input.readLine(); if (line == null || line.length() < FAULTLENGTH) { return null; } int capidx = line.indexOf("Caption"); int cmdidx = line.indexOf("CommandLine"); int rocidx = line.indexOf("ReadOperationCount"); int umtidx = line.indexOf("UserModeTime"); int kmtidx = line.indexOf("KernelModeTime"); int wocidx = line.indexOf("WriteOperationCount"); // Caption,CommandLine,KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < wocidx) { continue; } // 字段出現(xiàn)順序:Caption,CommandLine,KernelModeTime,ReadOperationCount, // ThreadCount,UserModeTime,WriteOperation String caption = this.substring(line, capidx, cmdidx - 1).trim(); String cmd = this.substring(line, cmdidx, kmtidx - 1).trim(); if (cmd.indexOf("javaw.exe") >= 0) { continue; } // log.info("line="+line); if (caption.equals("System Idle Process") || caption.equals("System")) { idletime += Long.valueOf(this.substring(line, kmtidx, rocidx - 1).trim()).longValue(); idletime += Long.valueOf(this.substring(line, umtidx, wocidx - 1).trim()).longValue(); continue; }

kneltime += Long.valueOf(this.substring(line, kmtidx, rocidx - 1).trim()).longValue(); usertime += Long.valueOf(this.substring(line, umtidx, wocidx - 1).trim()).longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; }

/** * 獲取網(wǎng)口上下行速率 * * @param input * @return */ public String[] readInLine(BufferedReader input, String osType) { String rxResult = ""; String txResult = ""; StringTokenizer tokenStat = null; try { if (osType.equals("linux")) { // 獲取linux環(huán)境下的網(wǎng)口上下行速率 String result[] = input.readLine().split(" "); int j = 0, k = 0; for (int i = 0; i < result.length; i++) { if (result[i].indexOf("RX") != -1) { j++; if (j == 2) { rxResult = result[i + 1].split(":")[1]; } } if (result[i].indexOf("TX") != -1) { k++; if (k == 2) { txResult = result[i + 1].split(":")[1]; break; } } }

} else { // 獲取windows環(huán)境下的網(wǎng)口上下行速率 input.readLine(); input.readLine(); input.readLine(); input.readLine(); tokenStat = new StringTokenizer(input.readLine()); tokenStat.nextToken(); rxResult = tokenStat.nextToken(); txResult = tokenStat.nextToken(); } } catch (Exception e) { log.error(e.getMessage()); } String arr[] = { rxResult, txResult }; return arr; }

/** * 由于String.subString對漢字處理存在問題(把一個漢字視為一個字節(jié))瘟则,因此在 包含漢字的字符串時存在隱患,現(xiàn)調(diào)整如下: * * @param src *? ? ? ? ? ? 要截取的字符串 * @param start_idx *? ? ? ? ? ? 開始坐標(biāo)(包括該坐標(biāo)) * @param end_idx *? ? ? ? ? ? 截止坐標(biāo)(包括該坐標(biāo)) * @return */ private String substring(String src, int start_idx, int end_idx) { byte[] b = src.getBytes(); String tgt = ""; for (int i = start_idx; i <= end_idx; i++) { tgt += (char) b[i]; } return tgt; }

/** * 格式化浮點數(shù)(float 和 double)枝秤,保留兩位小數(shù) * * @param obj * @return */ private String formatNumber(Object obj) { String result = ""; if (obj.getClass().getSimpleName().equals("Float")) { result = new Formatter().format("%.2f", (float) obj).toString(); } else if (obj.getClass().getSimpleName().equals("Double")) { result = new Formatter().format("%.2f", (double) obj).toString(); } return result; }

/** * 測試方法 :監(jiān)測java執(zhí)行相關(guān)命令后是否能獲取到結(jié)果集(注:此方法執(zhí)行后會中斷程序的執(zhí)行醋拧,測試完后請注釋掉) * * @param br */ public void testGetInput(BufferedReader in) { int y = 0; try { while ((y = in.read()) != -1) { System.out.print((char) y); } } catch (IOException e) { e.printStackTrace(); } return; }

class SysInfoAcquirerTimerTask extends TimerTask {

@Override public void run() { try { System.out.println("任務(wù)開始:"); long startTime = System.currentTimeMillis(); int threadCount = getThreadCount(); String cpuRate = getCPURate(); // CPU使用率 String memoryRate = getMemoryRate(); // 內(nèi)存占用率 JSONObject jsonObj = JSON.parseObject(getNetworkThroughput()); String upSpeed = jsonObj.getString("txPercent");// 上行速度 String downSpeed = jsonObj.getString("rxPercent"); // 下行速度 System.out.println("JVM? PID:" + pid); System.out.println("JVM 線程數(shù):" + threadCount); System.out.println("內(nèi)存占用率:" + memoryRate + "%"); System.out.println("CPU使用率:" + cpuRate + "%"); System.out.println("上行速度:" + upSpeed + "MB/s 下行速度:" + downSpeed + "MB/s");

//后續(xù)操作為將采集到的數(shù)據(jù)存放到數(shù)據(jù)庫,可自行設(shè)計 SysPerformInfo sysPerformInfo = new SysPerformInfo(); sysPerformInfo.setId(UuidUtil.getUuid()); sysPerformInfo.setCpuRate(Float.parseFloat(cpuRate)); sysPerformInfo.setMemoryRate(Float.parseFloat(memoryRate)); sysPerformInfo.setThreadCount(threadCount); sysPerformInfo.setUpSpeed(Float.parseFloat(upSpeed)); sysPerformInfo.setDownSpeed(Float.parseFloat(downSpeed)); sysPerformInfoService.insertPerformInfo(sysPerformInfo); // 將采集到的數(shù)據(jù)插入數(shù)據(jù)庫 long endTime = System.currentTimeMillis(); System.out.println("任務(wù)總耗時:" + (endTime - startTime) / (1000 * 60) + "分鐘"); } catch (Exception e) { e.printStackTrace(); log.error(e.toString()); } }

}

@PreDestroy public void destroy() { log.info("do nothing in @PreDestroy method"); }}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淀弹,一起剝皮案震驚了整個濱河市趁仙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垦页,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干奢,死亡現(xiàn)場離奇詭異痊焊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忿峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門薄啥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逛尚,你說我怎么就攤上這事垄惧。” “怎么了绰寞?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵到逊,是天一觀的道長铣口。 經(jīng)常有香客問我,道長觉壶,這世上最難降的妖魔是什么脑题? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮铜靶,結(jié)果婚禮上叔遂,老公的妹妹穿的比我還像新娘。我一直安慰自己争剿,他們只是感情好已艰,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚕苇,像睡著了一般哩掺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捆蜀,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天疮丛,我揣著相機(jī)與錄音,去河邊找鬼辆它。 笑死誊薄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锰茉。 我是一名探鬼主播呢蔫,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼飒筑!你這毒婦竟也來了片吊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤协屡,失蹤者是張志新(化名)和其女友劉穎俏脊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肤晓,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡爷贫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了补憾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漫萄。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盈匾,靈堂內(nèi)的尸體忽然破棺而出腾务,到底是詐尸還是另有隱情,我是刑警寧澤削饵,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布岩瘦,位于F島的核電站未巫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏担钮。R本人自食惡果不足惜橱赠,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箫津。 院中可真熱鬧狭姨,春花似錦、人聲如沸苏遥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田炭。三九已至师抄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間教硫,已是汗流浹背叨吮。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瞬矩,地道東北人茶鉴。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像景用,于是被迫代替她去往敵國和親涵叮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359