JDK 自带 JVM 分析工具详解

3 篇文章 0 订阅
订阅专栏

本文基于 JDK 中自带的 JVM 工具来讲解,内容有

  • JDK 自带哪些 JVM 分析工具
  • 每个工具的具体使用场景


JDK 中自带的工具

目前,针对 Java 应用在运行过程中出现的大部分 JVM 问题(如 OOM,FGC 等),我们都可通过 JDK 中自带的一些工具来分析解决。JDK 自带的工具可在 JDK 的安装目录的 bin 文件夹下找到。见图 1。
在这里插入图片描述

图 1

在图 1 众多的命令中,几个常用命令需特别熟悉

  • jps
  • jinfo
  • jstack
  • jmap
  • jstat
  • jhat

以及不是 jdk 自带的 VisualVM。每个命令具体使用见下文。


使用技巧

每个工具都设置了若干选项,用于查看不同层面的信息,若不清楚每个工具应该配置什么参数,可通过

> cmd -help

来查看命令的使用方式,如查看 jps 使用方式。

> jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

当使用 jps 不带任何可选参数时,将返回 pid(进程号)及进程名称。
在这里插入图片描述

图 2

当仅使用 -q 参数时,将只返回 pid。
在这里插入图片描述

图 3


各工具使用场景

jps

jps 用于查看当前 JVM 上运行的 Java 进程。使用过 Linux 的同学都知道,Linux 系统下有一个 ps 命令,用于列出系统的所有进程,可配合不同的参数选项,查看不同层面的信息。jps 具体的使用方式可见图 2、图 3,此处不累述。

jinfo

jinfo 全称 Java Configuration info 可用于查看或设置(部分可动态配置的)

  • 具体的 pid 信息
  • 可执行文件信息
  • 远程服务信息

其使用方式如下

> jinfo -help
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

在这里,我们仅需知道 如何使用 jinfo 查看指定 pid 的信息 即可。
使用方式有以下三种

  • 仅使用 -flag(s) 可选参数
    使用 -flags 查看所有 VM 参数信息

    > jinfo -flags pid	
    

    在这里插入图片描述

    图 4

    或使用 -flag name 查看指定 name 的参数信息。(其实使用 -flags 已经可查看所有的 VM 参数,个人觉得没有特别大的必要使用 -flag 那么 查看单个 VM 参数信息)

    > jinfo -flag name pid
    
  • 仅使用 -sysprops 可选参数
    使用 -sysprops 参数查看系统信息,系统信息较多,这里不展示结果,感兴趣的同学可以自己在命令行输入下述命令查看。

    > jinfo -sysprops pid
    
  • 不使用任何可选参数

    > jinfo pid
    

    不使用任何参数查看进程信息时,将返回 -flags 和 -sysprops 两个参数的全部信息。

从图 4 可知,使用 jinfo 可查看到的 VM 参数信息有

  • 初始堆大小 InitialHeapSize
  • 最大堆大小 MaxHeapSize
  • 最大新生代大小 MaxNewSize
  • 老年代大小 OldSize
  • 垃圾回收算法 +UseParallelGC

jmap

jmap 用于查看指定 pid 进程内存相关的信息。与 jinfo 类似,我们仅关注与具体进程相关的信息,不关注具体文件或远程服务的信息。

> jmap -help
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server) 

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary    
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

当使用命令

> jmap -heap pid 

查看指定进程 id 内存信息时,将输出当前进程的堆内存概览,新生代、老年代的使用情况以及垃圾回收算法。如

> jmap -heap 2060
Attaching to process ID 2060, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11

using thread-local object allocation.
Parallel GC with 13 thread(s)     // 垃圾回收算法

Heap Configuration:    // 堆配置总览
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 10485760 (10.0MB)   // 堆大小
   NewSize                  = 3145728 (3.0MB)   // 新生代大小
   MaxNewSize               = 3145728 (3.0MB)    // 新生代最大值
   OldSize                  = 7340032 (7.0MB)   // 老年代大小
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:  // 堆使用明细
PS Young Generation
Eden Space:
   capacity = 2097152 (2.0MB)
   used     = 1416072 (1.3504714965820312MB)
   free     = 681080 (0.6495285034179688MB)
   67.52357482910156% used
From Space:   
   capacity = 524288 (0.5MB)
   used     = 516112 (0.4922027587890625MB)
   free     = 8176 (0.0077972412109375MB)
   98.4405517578125% used
To Space:
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation
   capacity = 7340032 (7.0MB)
   used     = 391312 (0.3731842041015625MB)
   free     = 6948720 (6.6268157958984375MB)
   5.331202915736607% used

若想看指定进程 id 下有多少对象正在等待被回收,可使用命令

> jmap -finalizerinfo pid

如当前进程无正在等待被回收对象时,将输出

> jmap -finalizerinfo 3932
Attaching to process ID 3932, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11
Number of objects pending for finalization: 0

使用 -histo[:live] 可查看每个 class 的实例数目,内存使用情以及类全名信息。如在 -histo 后加上 live 子参数,将只统计活的对象数量(即在统计之前会触发一次 Full GC)。如

> jmap -histo -F 3932
Attaching to process ID 3932, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11
Iterating over heap. This may take a while...
Object Histogram:

num       #instances    #bytes  Class description
--------------------------------------------------------------------------
1:              1441    1092752 byte[]
2:              5234    684472  char[]
3:              243     121520  int[]
4:              4251    102024  java.lang.String
5:              565     64944   java.lang.Class
6:              669     40048   java.lang.Object[]
7:              791     31640   java.util.TreeMap$Entry
...
// 以下还有很多,此处仅做 case 说明,未给出所有 class 的实例数量及相关信息

注意!!!

遍历堆并生成直方图的过程中,目标 JVM 都是 stop-the-world 的,所以对于较大的堆或者生产环境上的程序,要谨慎执行。如果目标 JVM 无响应,就加上 -F 参数强制执行之(同 jstack),此时 :live 开关无效化

若想把整个堆转存为快照文件,可使用 -dump 参数,如

> jmap -F -dump:file=3932.hprof 23308
Attaching to process ID 23308, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.311-b11
Dumping heap to 3932.hprof ...
Heap dump file created

生成快照文件可使用 jhat、VisualVM 等工具查看。

  • 使用 jhat 查看时会在本地启动一个服务监听 7000端口,直接访问 localhost:7000 可查看快照信息。
  • 使用 VisualVM 查看时,需先安装 VisualVM 插件,可戳 下载。

使用 VisualVM 查看效果如下。
在这里插入图片描述

图 5

jstack

jstack 与 jmap 类似,可查看或 dump 指定进程的内存信息,除此之外,jstack 还可分析前进程内各个线程的信息,如

  • 是否发生死锁
  • 线程执行耗时长的原因
  • 线程状态

等信息。jstack 使用方式

> jstack -help
Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

需要说明的是,jstack 若查看的是 hung(挂起)的进程,需要使用 -F 强制输出,否则看不到任何输出信息。

在这里插入图片描述

图 6

jhat

jhat 可用于分析 dump 下来的二进制文件

jhat -help
Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

        -J<flag>          Pass <flag> directly to the runtime system. For
                          example, -J-mx512m to use a maximum heap size of 512MB
        -stack false:     Turn off tracking object allocation call stack.
        -refs false:      Turn off tracking of references to objects
        -port <port>:     Set the port for the HTTP server.  Defaults to 7000
        -exclude <file>:  Specify a file that lists data members that should
                          be excluded from the reachableFrom query.
        -baseline <file>: Specify a baseline object dump.  Objects in
                          both heap dumps with the same ID and same class will
                          be marked as not being "new".
        -debug <int>:     Set debug level.
                            0:  No debug output
                            1:  Debug hprof file parsing
                            2:  Debug hprof file parsing, no server
        -version          Report version number
        -h|-help          Print this help and exit
        <file>            The file to read

For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".

All boolean options default to "true"

可根据具体需要,使用不同的参数分析 dump 下课来的文件,如

在这里插入图片描述

图 7

jstat

jstat 用于查看 jvm 内存回收统计信息,使用方式

> jstat -help
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.

乍一看,好像没有看到啥有用参数,其实使用 jstat -options 可查看更多信息。

> jstat -options
-class             // 显示类加载信息
-compiler          // 显示编译信息
-gc                // 显示GC相关信息
-gccapacity        // 显示各区域容量及使用情况
-gccause           // 显示垃圾回收信息
-gcmetacapacity    // 显示元空间容量信息
-gcnew             // 显示新生代信息
-gcnewcapacity     // 显示新生代容量信息
-gcold             // 显示老年代信息
-gcoldcapacity     // 显示老年代容量信息
-gcutil            // 显示垃圾收集信息
-printcompilation  // 显示JIT编译的方法信息

如使用

> jstat -gc pid 2s 5

查看指定 pid 的 Java 进程内存回收信息,每隔 2s 输出一次,共输出 5 次,将得到

> jstat -gc 4280 2s 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
43520.0 43520.0  0.0    0.0   261120.0 157493.1  441856.0   13949.7   21296.0 20552.0 2944.0 2735.4      1    0.009   1      0.017    0.026
43520.0 43520.0  0.0    0.0   261120.0 157493.1  441856.0   13949.7   21296.0 20552.0 2944.0 2735.4      1    0.009   1      0.017    0.026
43520.0 43520.0  0.0    0.0   261120.0 157493.1  441856.0   13949.7   21296.0 20552.0 2944.0 2735.4      1    0.009   1      0.017    0.026
43520.0 43520.0  0.0    0.0   261120.0 157493.1  441856.0   13949.7   21296.0 20552.0 2944.0 2735.4      1    0.009   1      0.017    0.026
43520.0 43520.0  0.0    0.0   261120.0 157493.1  441856.0   13949.7   21296.0 20552.0 2944.0 2735.4      1    0.009   1      0.017    0.026

输出的信息中,各参数描述见下表。

参数描述
S0C年轻代中第一个survivor(幸存区)的容量 (字节)
S1C年轻代中第二个survivor(幸存区)的容量 (字节)
S0U年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC年轻代中Eden(伊甸园)的容量 (字节)
EU年轻代中Eden(伊甸园)目前已使用空间 (字节)
OCOld代的容量 (字节)
OUOld代目前已使用空间 (字节)
PCPerm(持久代)的容量 (字节)
PUPerm(持久代)目前已使用空间 (字节)
YGC从应用程序启动到采样时年轻代中gc次数
YGCT从应用程序启动到采样时年轻代中gc所用时间(s)
FGC从应用程序启动到采样时old代(全gc)gc次数
FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT从应用程序启动到采样时gc用的总时间(s)
表 1
Java虚拟机JVM性能调优实战
braverex的博客
02-23 2181
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分析工具一般分为...
java堆内存分析实操 | dump文件
你个无聊小demo的博客
10-10 2695
java堆内存分析实操 | dump文件
JVM调优--04---dump文件分析 、arthas在线排查工具
时光里的博客
12-04 8782
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录arthas在线排查工具 arthas在线排查工具 http://git.mashibing.com/bjmashibing/JVM/-/blob/master/05_GC%20and%20Tuning.md
jvisualVM分析jvm内存使用快照dump
最新发布
Muscleheng的博客
04-14 1500
服务发生内存溢出,就需要查看服务器上Java服务的jvm堆内存使用情况,可以使用dump命令生成dump文件,然后下载到本地,然后使用jvisualVM工具打开,即可实现可视化分析。生成dump文件常用的两种方式:第一种:使用命令直接生成。第二种:java -jar启动服务的时候添加dump参数,服务发生内存溢出时自动生成。
java内存分析工具dumpAnalyzer
04-18
dumpAnalyzer图形化进行内存分析,可以很方便的知道系统里面什么地方存在性能瓶颈
JDK自带JVM调优工具,一次性打包讲给你听
田维常
11-18 358
关注“Java后端技术全栈”回复“000”获取大量电子书前面已经讲过了jps和jstat调优工具。今天我们继续说一下其它4个工具。这些工具都在jdk的bin目录下。如何使用jinfo工具...
[JVM]dump分析工具_fastthread.io
新一的技术笔记
08-10 8308
目录 前言 使用 前言 dump分析工具,真解决问题还是得靠这种强大的图形化界面hhh 这个之前写在印象笔记中,现在拿出来分享整理。 使用 https://fastthread.io/ 将线程 jstack pid 出来之后,压缩一下成为zip 然后 上传上去 一般线程dump后都是人工去分析Java线程Dump分析工具fastThread。 每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同
jvm工具及命令大全
weixin_30929295的博客
08-31 128
虚拟机栈 栈桢大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k 堆 -Xms:堆的最小值; -Xmx:堆的最大值; -Xmn:新生代的大小; -XX:NewSize;新生代最小值; -XX:MaxNewSize:新生代最大值; 例如- Xmx256m 方法区/永久代 用于存储已经被虚拟机加载的类信息,常量("zdy","123"等),静态变...
jdk8 jvm 参数图(随手参考好资料)
02-27
常用jvm参数都在这张图中,参考起来方便,是国外大神整理的
JDK自带多线程工具详解
06-30
由浅入深,通过图解和手写代码,讲解Java版的多线程,主要讲解如下内容: ...JDK多线程工具包中,若干种工具的原理和手写实现: ReentrantLock、CountDownLanuh、CyclicBarrier、Semaphore      
JDK自带VM分析工具
05-29
JDK自带VM分析工具jps,jstat,jmap,jconsole
dump文件查看分析工具
10-27
用于分析dump文件,很好用的一款内存分析工具,可以用来分析OOM等问题
JAVA jvm DUMP 内存分析
09-29
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
Jvm堆栈dump文件分析
04-26
IBM java dump 文件分析工具分析java堆栈信息
jdk自带线程池实例详解
08-28
在最近做的一个项目中,需要大量的使用到多线程和线程池,下面就java自带的线程池和大家一起分享
jdk自带定时器使用方法详解
08-30
主要为大家详细介绍了jdk自带定时器的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
JVM-通过MAT工具dump文件进行分析
write less , do more
10-06 7902
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止 了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
【华为云技术分享】干货分享丨jvm系列:dump文件深度分析
华为云官方博客
07-09 3648
摘要:java内存dumpjvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢? JVM dump java内存dumpjvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来 获取JVM dump文件 获取dump文件的方式分为主动和被动i.主动方式..
dump分析工具_JVM实战:JVM常用监控工具
weixin_39757169的博客
11-29 4054
本文主要了解以下内容:1、JDK自带的几款在线监控工具(JPS、jstat、jstack、jmap),用户实时监控JVM运行装填2、JVM离线分析工具(VisualVM),用于分析dump下来的堆内存文件,远程监控JVM状态。3、第三方在线监控工具(Arthas的使用)1、在线监控工具1-1、JPS (打印Java进程信息)使用场景 : 查看当前机器的所有Java进程信息(可追踪到应用进程...
jdk8jvm参数配置详解
09-03
Java Development Kit (JDK)是Java开发工具包,而JVM参数是为Java虚拟机(JVM)配置的一组参数。JDK8是Java 8版本的JDK,下面我将详细解释JDK8中常用的JVM参数配置。 1. -Xms和-Xmx:这是设置JVM初始化堆内存和最大堆内存的参数。-Xms设定初始堆大小,-Xmx设定最大堆大小。例如,-Xms512m表示初始堆大小为512MB,-Xmx1024m表示最大堆大小为1GB。 2. -Xss:这是设置线程栈大小的参数。默认值根据操作系统和JVM版本而定。可以根据应用程序的需求进行调整。例如,-Xss256k表示线程栈的大小为256KB。 3. -XX:MetaspaceSize和-XX:MaxMetaspaceSize:这是设置元空间(Metaspace)初始大小和最大大小的参数。元空间是Java 8引入的一种取代永久代(PermGen)的存储区域。例如,-XX:MetaspaceSize=128m表示元空间的初始大小为128MB,-XX:MaxMetaspaceSize=256m表示元空间的最大大小为256MB。 4. -XX:NewSize、-XX:MaxNewSize和-XX:SurvivorRatio:这些是控制新生代(Young Generation)内存大小以及Eden区、Survivor区的比例的参数。新生代是堆内存的一部分,存放新创建的对象。可以通过调整这些参数来优化垃圾回收性能。 5. -XX:+UseParallelGC和-XX:+UseConcMarkSweepGC:这些是选择垃圾回收器的参数。Parallel GC(并行垃圾回收器)和CMS(并发标记清除垃圾回收器)是JDK8默认的两种垃圾回收器。分别用于在不同场景下提供更好的垃圾回收性能。 这些只是JDK8中常用的JVM参数配置的一部分。根据实际需求,还有其他许多参数可以进行调整以达到最佳性能和稳定性。重要的是要了解这些参数,并根据应用程序的需求进行适当的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • JMockit 使用指南 3455
  • Java 容器简介 2037
  • ubuntu 下安装python3.7+开发环境 1481
  • JDK 自带 JVM 分析工具详解 1477
  • SpringBoot 源码阅读环境搭建 465

分类专栏

  • Java 容器 2篇
  • Java 3篇
  • BPM
  • Git
  • MySQL
  • Redis
  • UT 1篇
  • SpringBoot 源码分析 1篇

最新评论

  • SpringBoot 源码阅读环境搭建

    CSDN-Ada助手: 推荐 云原生入门 技能树:https://edu.csdn.net/skill/cloud_native?utm_source=AI_act_cloud_native

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Java 容器之 HashMap 详解
  • Java 容器简介
  • JMockit 使用指南
2022年5篇
2020年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司朔州关键词排名黔东南百姓网标王多少钱郑州企业网站制作推荐阳江英文网站建设松原优化价格台州百搜标王价格保山百度网站优化公司衡阳模板推广公司东营网站设计陇南设计公司网站深圳百度标王多少钱河源网站开发公司毕节外贸网站建设多少钱同乐建网站推荐荆州网站优化软件报价舟山网络推广多少钱木棉湾外贸网站建设孝感如何制作网站推荐毕节SEO按天计费价格榆林网站改版多少钱萍乡网页设计价格济源百度网站优化哪家好宿迁seo排名公司南山seo优化报价内江百度seo多少钱中山网站推广推荐榆林外贸网站建设塘坑网站搜索优化宝安SEO按天扣费报价北京企业网站改版公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化