JVM性能优化-常用工具

简介

性能优化和故障排除是一件比较麻烦的事,针对性能优化,必须得先了解相关的优化工具,然后针对不同场景不同问题选用不同工具进行分析,找出故障原因;
jdk自带性能分析工具有:jps,jstack,jstat,jconsole,jmap和mat,visualvm;
linux常用性能分析工具有: top ,pidstat等

jps(jvm process status tools)

jps是用来显示当前所有java pid的命令工具,利用它可以用来查看java进程pid,以及main方法传递的参数,main方法的包名,以及运行时jvm配置参数:

  • jps (null):jps 后面不跟任何参数表示查看当前系统中所有运行java的进程的pid;
  • jps -l:查看运行java进程的main方法的完整的pacakge名称或者jar应用文件的完整路径名称;例如:
D:\java\jdk10\bin>jps -l
12912
48028 jdk.jcmd/sun.tools.jps.Jps
  • jps -m:查看运行java进程的main方法传递进来的参数,如果没有就为null;
  • jps -v:查看运行java进程启动配置的jvm运行时参数,例如:
D:\java\jdk10\bin>jps -v
12912  -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Dosgi.dataAreaRequiresExplicitInit=true -Xms256m -Xmx1024m -Declipse.p2.max.threads=10 -Doomph.update.url=http://download.eclipse.org/oomph/updates/milestone/latest -Doomph.redirection.index.redirection=index:/->http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/ -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Dosgi.dataAreaRequiresExplicitInit=true -Xms256m -Xmx1024m -Declipse.p2.max.threads=10 -Doomph.update.url=http://download.eclipse.org/oomph/updates/milestone/latest -Doomph.redirection.index.redirection=index:/->http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/
61372 Jps -Dapplication.home=D:\java\jdk10 -Xms8m -Djdk.module.main=jdk.jcmd

jstack(jvm stack tools)

jstack是jvm自带的可以用来生成运行时线程快照的工具,通过线程快照可以得到jvm运行时每一条运行中线程的信息,一般可以用来分析线程长时间停顿的原因,如死锁,死循环,激烈的锁竞争,外部资源请求等待,如下:

D:\java\jdk10\bin>jstack 34152
2019-05-23 23:20:34
Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.0.2+7-LTS mixed mode):

Threads class SMR info:
_java_thread_list=0x000001fbfd43c300, length=11, elements={
0x000001fbfc995800, 0x000001fbfc996800, 0x000001fbfd298800, 0x000001fbfd29a800,
0x000001fbfd2a4000, 0x000001fbfd2a9000, 0x000001fbfd2c0800, 0x000001fbfd444000,
0x000001fbfd454000, 0x000001fbfd455800, 0x000001fbd9008800
}

"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=19.85s tid=0x000001fbfc995800 nid=0x57ac waiting on condition  [0x0000003a388ff000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.2/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@11.0.2/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.2/Reference.java:213)

"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=19.85s tid=0x000001fbfc996800 nid=0x194e0 in Object.wait()  [0x0000003a389ff000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.2/Native Method)
        - waiting on <0x0000000710d08f10> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000710d08f10> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.2/Finalizer.java:170)

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=19.82s tid=0x000001fbfd298800 nid=0x1364c runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #5 daemon prio=5 os_prio=2 cpu=0.00ms elapsed=19.82s tid=0x000001fbfd29a800 nid=0x1fc0 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 cpu=15.63ms elapsed=19.82s tid=0x000001fbfd2a4000 nid=0x11f28 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #9 daemon prio=9 os_prio=2 cpu=31.25ms elapsed=19.82s tid=0x000001fbfd2a9000 nid=0xf1bc waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #10 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=19.82s tid=0x000001fbfd2c0800 nid=0xcb58 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #11 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=19.78s tid=0x000001fbfd444000 nid=0xe398 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #12 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=19.78s tid=0x000001fbfd454000 nid=0xeb30 in Object.wait()  [0x0000003a391ff000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.2/Native Method)
        - waiting on <0x0000000710c5ad28> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000710c5ad28> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@11.0.2/CleanerImpl.java:148)
        at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
        at jdk.internal.misc.InnocuousThread.run(java.base@11.0.2/InnocuousThread.java:134)

"test" #13 prio=5 os_prio=0 cpu=19734.38ms elapsed=19.77s tid=0x000001fbfd455800 nid=0x63d8 runnable  [0x0000003a392ff000]
   java.lang.Thread.State: RUNNABLE
        at jvm.optimize.TestOptimize$1.run(TestOptimize.java:11)

"DestroyJavaVM" #14 prio=5 os_prio=0 cpu=125.00ms elapsed=19.77s tid=0x000001fbd9008800 nid=0xb574 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=2 cpu=0.00ms elapsed=19.86s tid=0x000001fbfc983000 nid=0x6270 runnable

"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=19.89s tid=0x000001fbd901d800 nid=0x104fc runnable

"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=19.89s tid=0x000001fbd907b800 nid=0x9d20 runnable

"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=19.89s tid=0x000001fbd907e000 nid=0x1174c runnable

"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=19.88s tid=0x000001fbfc861800 nid=0xa648 runnable

"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=19.88s tid=0x000001fbfc865000 nid=0xe880 runnable
"VM Periodic Task Thread" os_prio=2 cpu=0.00ms elapsed=19.78s tid=0x000001fbfd44b000 nid=0x10dc0 waiting on condition

JNI global refs: 6, weak refs: 0

jstat

jstat是用来对基于Hotspot的jvm,对其堆的使用情况进行实时检测,如:

  • 类的加载与卸载情况;
  • 查看新生代,老年代,持久代堆内存容量及使用情况;
  • 查看新生代,老年代,持久代垃圾回收情况,包括回收次数,每次回收消耗时间等;
  • 查看新生代Eden区以及Survivor区分区情况;

例如:

D:\java\jdk10\bin>jstat -gc 68748

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
10752.0 10752.0  0.0    0.0   65536.0   7864.9   175104.0     0.0     4480.0 751.8  384.0   76.4       0    0.000   0      0.000    0.000

如上所示,各指标信息如下:

  • S0C:表示Survivor 0区容量大小(字节)
  • S1C:表示Survivor 1区容量大小(字节);
  • S0U:表示Survivor 0区使用的容量大小;
  • S1U:表示Survivor 1区使用的容量大小;
  • EC:表示Eden区容量大小;
  • EU:表示Eden区使用容量大小;
  • OC:表示老年代容量大小;
  • OU:表示老年代使用容量大小;
  • MC:表示元数据区容量大小(JDK8以后出现的);
  • MU:表示元数据区使用大小;
  • CCSC:表示压缩类空间容量大小 (Compress Class Space Capacity);
  • CCSU:表示压缩类空间使用大小;
  • YGC:年轻代垃圾回收次数(Young GC Count);
  • YGCT:年轻代垃圾回收消耗时间(Young GC Time);
  • FGC:full gc垃圾回收次数;
  • FGCT :full gc垃圾回收消耗时间(秒);
  • GCT: GC TIMe,即垃圾回收消耗总时间=FGCT+YGCT;

jmap,mat,jhprof

jmap是用来打印或者导出某个jvm进程内所有对象(存活的或者死亡还未回收的);
jmap使用方法如下:

  • jmap -heap pid:查看该进程下堆内存使用情况;
Heap Configuration:
   MinHeapFreeRatio         = 0//对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio         = 100//对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 4183818240 (3990.0MB)//对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 87031808 (83.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 1394606080 (1330.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize                  = 175112192 (167.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio                 = 2//对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8//对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   MetaspaceSize            = 21807104 (20.796875MB) //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage://堆内存使用情况
PS Young Generation//年轻代
Eden Space://Eden区空间使用情况
   capacity = 340787200 (325.0MB)
   used     = 306906696 (292.6890335083008MB)
   free     = 33880504 (32.31096649169922MB)
   90.05816415640024% used
From Space://From Survivor区的内存使用情况
   capacity = 524288 (0.5MB)
   used     = 491520 (0.46875MB)
   free     = 32768 (0.03125MB)
   93.75% used
To Space://To Survivor区内存使用情况
   capacity = 19922944 (19.0MB)
   used     = 0 (0.0MB)
   free     = 19922944 (19.0MB)
   0.0% used
PS Old Generation //老年代内存使用情况
   capacity = 219676672 (209.5MB)
   used     = 40968392 (39.07050323486328MB)
   free     = 178708280 (170.42949676513672MB)
   18.649404885376267% used
  • jmap -histo:live pid :查看指定进程下存活对象信息,可用于定位内存泄漏;
  • jmap -histo:live pid >1.txt将信息输出到指定文件中

mat:是Eclipse的内存插件,可以用来查找内存泄漏和减少内存消耗;

jinfo

jinfo用于打印指定Java进程、核心文件或远程调试服务器的Java配置信息。配置信息包括Java系统属性、Java虚拟机命令行标识参数。

D:\java\jdk10\bin>jinfo 68748
Java System Properties:
#Fri May 24 01:03:18 CST 2019
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D\:\\java\\jre1.8\\bin
java.vm.version=25.211-b12
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D\:\\jar files
java.runtime.version=1.8.0_211-b12
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D\:\\java\\jre1.8\\lib\\endorsed
os.arch=amd64
java.io.tmpdir=C\:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\
line.separator=\r\n
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.library.path=C\:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C\:\\WINDOWS\\Sun\\Java\\bin;C\:\\WINDOWS\\system32;C\:\\WINDOWS;D\:\\dev tools\\apache-maven-3.6.1\\bin\\;C\:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;D\:\\Python37;D\:\\Python37\\Scripts;C\:\\Program Files (x86)\\NetSarang\\Xshell 6\\;D\:\\java\\jdk-11.0.2\\bin;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\WINDOWS\\System32\\OpenSSH\\;C\:\\Program Files\\Git\\cmd;C\:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C\:\\Go\\bin;D\:\\Program Files\\nodejs;D\:\\Program Files\\nodejs\\node_global;D\:\\Thrift;D\:\\protobuf\\protoc-3.4.0-win32\\bin;D\:\\apache-ant-1.10.6\\bin;D\:\\hadoop-3.1.2\\bin;D\:\\hadoop-3.1.2\\sbin;C\:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;C\:\\Users\\Administrator\\AppData\\Roaming\\npm;.
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C\:\\Users\\Administrator
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.8
java.class.path=testjvm.jar
user.name=Administrator
java.vm.specification.version=1.8
sun.java.command=testjvm.jar
java.home=D\:\\java\\jre1.8
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_211
java.ext.dirs=D\:\\java\\jre1.8\\lib\\ext;C\:\\WINDOWS\\Sun\\Java\\lib\\ext
sun.boot.class.path=D\:\\java\\jre1.8\\lib\\resources.jar;D\:\\java\\jre1.8\\lib\\rt.jar;D\:\\java\\jre1.8\\lib\\sunrsasign.jar;D\:\\java\\jre1.8\\lib\\jsse.jar;D\:\\java\\jre1.8\\lib\\jce.jar;D\:\\java\\jre1.8\\lib\\charsets.jar;D\:\\java\\jre1.8\\lib\\jfr.jar;D\:\\java\\jre1.8\\classes
java.vendor=Oracle Corporation
sun.stderr.encoding=ms936
file.separator=\\
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.stdout.encoding=ms936
sun.desktop=windows
sun.cpu.isalist=amd64

VM Flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4280287232 -XX:MaxNewSize=1426587648 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

VM Arguments:
java_command: testjvm.jar
java_class_path (initial): testjvm.jar
Launcher Type: SUN_STANDARD

jconsole

jconsole使用java gui编写的图形界面可用于展示监视的java服务器,功能很强大,可以可视化的参看java服务器运行时线程,对象,内存等,如下图:


图片.png

jhat(jvm heap analysis tool)

jhat是虚拟机堆转储快照分析工具,用于分析heapdump文件,可以建立http连接,让用户在浏览器上对堆进行分析;相对mat来说,jhat没有图形那么直观;
使用方法如下参考

  • 导出堆,如:jmap -dump:live,file=b.bin 81301
  • 分析堆,如:jhat test.bin
  • 查看堆,如:http://xxx.xxx:7000/

jcmd

jcmd功能很强大,可以用来导出堆,查看堆,导出线程,查看线程,查看进程信息,执行GC等;

查看java进程:

D:\java\jdk10\bin>jcmd
74512 jdk.jconsole/sun.tools.jconsole.JConsole
50184 jdk.jcmd/sun.tools.jcmd.JCmd
68748 testjvm.jar

可以使用help:

D:\java\jdk10\bin>jcmd 68748 help
68748:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

通过help,可以看到能进行哪些操作,例如查看VM运行时间:

D:\java\jdk10\bin>jcmd 68748 VM.uptime
68748:
5334.977 s

JvisualVM(可视化vm分析工具)

该工具非常强大,可以以图形的方式对vm对象进行展示,快速分析,以及生成海量监控数据,并且可以分析GC趋势等等;
具体可以参考这篇文章:JvisualVM使用jp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,207评论 0 7
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,229评论 0 9
  • 去年,在广东发生过这样一个例子,九个月大的女婴持续高烧28天不退,在广东老家当地医院就诊不见好转,张奶奶一家带着孩...
    你所描绘的地方阅读 550评论 0 0
  • 其实一个人也挺好的 想笑的时候就笑, 想哭就哭 不必去想那些不开心的事, 伤心难受时候呢 就看看可以包容你所有的天...
    若素782006阅读 1,206评论 0 0
  • 七夕前夜,有人送来一只小泰迪,好可爱,刚断奶,摸一下还会害羞的躲起来。以前好怕狗,但是好想要养狗,家里所有姓曹的人...
    一颗剥不开的松子阅读 128评论 0 0