旅游网站建设流程是什么意思,常州seo网站推广,学些网站制作,浙江网站建设品牌JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈https://blog.csdn.net/zhenghuishengq/article/details/129684076【四】运行时数据区共享区域之堆、逃逸分析https://blog.csdn.net/zhenghuishengq/article/details/129796509精通运行时数据区共享区域---堆一深入理解运行时数据区堆1堆空间概念2堆内存空间2.1堆内存的细分2.2堆大小的基本设置2.3堆大小的计算规则3堆对象3.1堆空间对象组成3.2堆对象分配的一般过程3.3堆对象分配的特殊过程3.4代码示例4初识GC4.1初识Minor GCMajor GCFull GC4.1.1新生代GC的触发条件4.1.2老年代GC的触发条件4.1.3Full GC的触发机制5堆内存分配5.1基本的内存分配策略5.2TLAB5.2.1为什么要有TLAB5.2.2什么是TLAB6堆空间参数设置7逃逸分析(重点)7.1栈上分配7.2同步省略7.3标量替换8堆空间是分配对象的唯一选择吗(重点)一深入理解运行时数据区堆
1堆空间概念
heap 堆属于是运行时数据区的一块空间属于一块比较重要的一部分并且该区域的数据属于线程共享。 ⚽ 一个JVM实例只存在一个堆堆也是java内存管理的核心区域
⚽ Java堆在启动的时候被创建其空间大小也被确定并且是JVM管理的最大的一块内存空间(可调节)
⚽ 堆可以处于物理上不连续的内存空间中但是在逻辑上他应该是被视为连续的
⚽ 所有的线程共享JVM堆在这里还可以划分为私有的缓冲区Thread Local Allocation Buffer
⚽ 在java虚拟机规范中所有的对象实例以及数组都应该分配在堆上
⚽ 数组和对象可能永远不会存储在栈上因为栈帧中保存引用这个引用指向对象或者数组在堆中的位置
⚽ 在方法结束之后堆中的对象不会被立马移除仅仅在垃圾收集的时候才会被移除
⚽ 堆是GCGarbage Collection垃圾回收器执行垃圾回收的重点区域
2堆内存空间
2.1堆内存的细分
在JDK8之前堆内存的逻辑主要分为新生代老年代永久区
在JDK8以及JDK8之后堆内存主要分为新生代老年代永久区
jdk8的垃圾回收器如下可以直接在jdk安装目录下找到bin目录然后打开这个 jvisaulvm.exe 文件然后工具的在插件中安装一个 Visaul GC就可以看到下面的界面可知在jdk8中主要是分为Eden区old区和Metaspace这三个区域分别对应着新生代老年代和元空间 也可以直接新建一个application运行并设置其对应jvm的参数如设置初始大小和最大大小为10m并在控制台上将这个堆信息打印出来
-Xms10m -Xmx10m -XX:PrintGCDetails在运行项目后可以发现PSYoungGen新生代ParOldGen老年代Metaspace元空间其老年代所分配的内存最大。
hello
Heap
PSYoungGen total 2560 K, used 1086 K[0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
eden space 2048 K, 28 % used[0x00000000ffd00000, 0x00000000ffd91b68, 0x00000000fff00000)
from space 512 K, 98 % used[0x00000000fff00000, 0x00000000fff7e030, 0x00000000fff80000)
to space 512 K, 0 % used[0x00000000fff80000, 0x00000000fff80000, 0x0000000100000000)
ParOldGen total 7168 K, used 371 K[0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
object space 7168 K, 5 % used[0x00000000ff600000, 0x00000000ff65cf38, 0x00000000ffd00000)
Metaspace used 3520 K, capacity 4498 K, committed 4864 K, reserved 1056768 K
class space used 388 K, capacity 390 K, committed 512 K, reserved 1048576 K2.2堆大小的基本设置
Java堆区主要用于存储Java对象的实例那么堆的大小在JVM启动的时候就已经设定好了可以直接通过 -Xmx和 -Xms来设定堆的初始内存和最大内存当堆的最大内存超过设置的 -Xms 最大内存时则会直接抛出内存溢出异常。
-Xms : 设置堆空间新生代老年代的初始内存大小 -X表示的是Jvm的运行参数 ms表示的是memory start-Xmx设置堆空间新生代老年代的最大内存大小 并且在默认的堆空间中其最大内存为物理电脑内存 / 4初始内存为物理电脑内存 / 64
在实际开发中更加建议将初始堆内存和最大的堆内存设置成相同的值主要是省去堆空间频繁的扩容和释放带来的压力从而增加这种资源的利用率。
2.3堆大小的计算规则
堆大小主要分为新生代区和老年代区新生代又分为eden区survive存活区survive区有分为survive0和survive1区对象只能存在期中的一个区域里面每Minitor GC一次就会从一个survive区到另外一个survive区如果没有被清理掉那么他的年龄就会1当年龄达到15时就会从新生代中加入到老年代里面。
接下来在虚拟机中设置一个600m的堆大小依旧是用刚刚那个程序
-Xms600m -Xmx600m然后在main方法中运行之后输入以下命令
jps : 查看进程号
jstat -gc 进程号可以发现新生代有S0和S1的survive区和Eden区老年代有old区。对应的容量分别是最大容量和已使用容量如S0C表示的是survive0区的最大容量S0U则表示的是survice0已使用的容量。后面也有对应的YGC和FGC发生的次数。
并且在计算总容量的时候因为数据只能存在一个survive中因此只计算一个survice的内存大小所以有时计算出来的内容是小于实际设置的内容但结果是对的只是jvm在统计时只统计了一个survice存活区的大小。
3堆对象
3.1堆空间对象组成
在JVM中java对象可以分为两类 一类是生命周期较短的瞬时对象这类对象的创建和消亡都比较快 另一类周期长某些极端情况下可以和JVM进程的生命周期保持一致 java堆细分可以分为新生代(YoungGen)和老年代(OldGen)年轻代又可以细分为Eden区和Survivor0空间和Survivor1空间有时也被称为(from区和to区) 在这些对象中也会对新生代和老年代的空间大小设置对应的比例新生代和老年代的比例默认为1:2 当然也可以通过命令进行修改这个默认的比例一般不会修改这个默认值除非是知道这个老年代的对象偏多
-XX:NewRatio2 : 表示新生代占1老年代占2新生代占1/3默认比例
-XX:NewRatio4 : 表示新生代占1老年代占4新生代占1/5也可以直接通过命令查看通过jps查出进程号之后通过Jinfo去查看
jps
jinfo -flag NewRatio process(进程号)除了老年代和新生代的对空间有比例之外这个新生代中的Eden区和Survicor区也有对应的比例。如果是在Linux系统下其比例为8:1 如果是在Linux系统下其比例为6:1。
-XX:SurvivorRatio8 : 表示eden区占8Survicor区占1
-XX:SurvivorRatio6 : 表示eden区占6Survicor区占1
-XX:SurvivorRatio4 : 表示eden区占4Survicor区占1这个比例也可以直接通过命令查看通过jps查出进程号之后通过Jinfo去查看
jps
jinfo -flag SurvivorRatio process(进程号)因此可以得到一下结论 几乎所有的Java对象都是在Eden区被new出来 绝大多数对象的销毁在新生代就进行了
3.2堆对象分配的一般过程
为新对象分配内存时一件非常严谨和复杂的任务JVM的设计者们不仅需要考虑内存如何分配在哪里分配等问题并且由于内存分配算法与内存回收算法密切相关所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片等问题。 在new一个对象时会先将对象放在eden区并且该去有大小限制 当eden区的数据量满了程序还需要创建对象的时候JVM的Minor Gc就会对Eden区的垃圾进行回收当Eden区不再被其他对象引用的对象就进行销毁被引用的对象就加载到Survivor0区中然后此时eden区为空再将新数据加载到eden区中 只有eden去满才会触发这个Minor GC但是在触发这个垃圾回收时不仅会回收Eden区的对象也会回收这个Survivor区的对象 如果再次触发垃圾回收就会将eden区中的未被引用的对象销毁并且此时会检查survicor0区中的的数据如果不存在有对该对象的引用那么该对象也会被销毁然后将eden区未被销毁的和survicor0未被销毁的一起加入到survicor1区后面这两个区的对象往返移动 每将对象移动一次survicor区其age年龄就会加1初始值为1阈值为默认为15可以修改当年龄达到阈值时其再gc一次到达16就会将对象加入到老年代的空间区域中 当老年代中的空间满了时就会触发这个Full GC
总结
针对幸存者s0和s1的总结复制之后有交换谁不空谁是from谁空谁是to针对垃圾回收总结频繁回收在新生区很少在老年区回收几乎不在永久区/元空间回收
3.3堆对象分配的特殊过程 前两个步骤还是一样在new一个对象时会先将对象放在eden区并且该去有大小限制 当eden区的数据量满了程序还需要创建对象的时候JVM的Minor Gc就会对Eden区的垃圾进行回收当Eden区不再被其他对象引用的对象就进行销毁被引用的对象就加载到Survivor0区中然后此时eden区为空再将新数据加载到eden区中 这里开始就不一样了如果遇到的是一个大对象可以在eden区存的下但是在survivor区存活不下那么直接将这个对象晋升为老年代 如果遇到的是一个超大对象在eden区放不下那么也会直接晋升为老年代将这个超大对象存入到老年区中如果老年代内存不够那么就会触发Full GC如果还是不够或者内存大小直接小于这个超大对象的大小那么就会直接触发这个OOM内存溢出错误。
3.4代码示例
给对应的jvm堆配置的大小如下-Xms600m -Xmx600m 然后其对应的代码如下就是写一个死循环一直去创建Student对象list作为一个对象的引用只要list存在里面的对象就不会被回收掉。
public class Student {//创建bu数组byte bu[] new byte[new Random().nextInt(1024*200)];public static void main(String[] args) {ListStudent list new ArrayList();while (true){list.add(new Student());try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
}接下来继续通过这个jvisualvm这个jdk自带的工具来查看堆内信息一段时间之后就发现出现了这个OOM。
如下图所示Old区占400内存年轻代占200内存所以可知这个老年代区域新生代区域为2:1eden区大小为150survicor为25我这个是在windows系统下因此也符合6:1如果是linux系统那就是8:1了。
而这个eden区到达峰值时就表示eden区的数据满了那么就会触发一次Minor GC那么就会有数据存储在survivor中再到达一次峰值又会触发一次Minor GC因此可以看到数据在Survivor的两个区中移动而由于对象一直被引用着那么不管是Full GC还是Minor GC都是不能将数据给移除的因此这个young区的数据不能被清除数据就会都存在old区中那么old区的数据就是成直线上升的当old区满了之后那么就会直接触发这个OOM了。 4初识GC
4.1初识Minor GCMajor GCFull GC
JVM在进行GC的时候并非每次都对上面三个内存(新生代老年代和方法区)区域一起回收大部分的时候指的还是新生代。
而在HotSpot Vm中GC又分为两种类型部分收集和整堆收集 部分收集不是完整的收集整个Java堆的垃圾收集期中又分为 新生代收集(Minor GC / Young GC)只是新生代的垃圾收集 老年代收集(Major GC / Old GC)老年代的收集器很多时候Major GC和Full GC会混合使用区要区分是整堆回收还是老年代回收 混合收集(Mixed GC)收集整个新生代以及部分老年代的垃圾收集 整堆收集(Full GC)收集整个java堆和方法区的垃圾收集
4.1.1新生代GC的触发条件 当新生代空间不足时就会触发Minor GC这里的新生代指的是Eden区Survivor区是不会触发GC的 Java对象大多具有朝生夕灭的特性所以Minor GC也非常频繁回收速度也比较快 Minor GC会触发STW就是暂停其他的用户线程等垃圾回收结束才会恢复运行
4.1.2老年代GC的触发条件 指发生在老年代的GC对象从老年代消失即 Major GC或者Full GC 发生了 出现了Major GC之后经常会伴随着至少一次的Minor GC Major GC的速度一般会比Minor GC慢10倍其STW的时间甚至要更长 如果Major GC 之后内存还是不足就会直接报OOM了
4.1.3Full GC的触发机制 调用System.gc()时系统建议执行Full GC时但是不必然执行 老年代或者方法区空间不足 Minor GC进入老年代的平均大小大于老年代的可用内存 直接加入到老年代的对象的大小大于老年代可用内存的大小
5堆内存分配
5.1基本的内存分配策略 将对象优先分配到Eden区 大对象直接分配到老年代尽量避免程序中出现过多的大对象如大树组字符串等 长期存活的对象分配到老年代 动态对象年龄判断 空间分配担保
5.2TLAB
Thread Local Allocation Buffer即线程本地分配的一个缓冲区。
5.2.1为什么要有TLAB
堆区是线程的共享区域任何线程都可以访问到堆区的共享数据好处是进程间的通信比较方便由于对象的实例创建在JVM中非常频繁因此在并发环境下堆区划分的内存空间是线程不安全的为避免多个线程操作同一个地址需要使用加锁等机制但是也会一定的效率
5.2.2什么是TLAB 从内存模型角度来看对Eden区域继续进行划分JVM为每个线程分配了一个私有的缓冲区存在Eden空间 多线程在分配内存时使用TLAB可以避免一系列的线程安全问题并提升一定的吞吐量 JVM将这个TLAB作为内存分配的首选可以通过 -XX:UseTLAB 设置开启TLAB空间 默认情况下的这个TLAB内存只占1%也可以通过-XX:TLABWasteTargetPercent 设置其空间的百分比 一旦对象在创建这个TLAB空间分配失败JVM就会通过加锁机制确保数据操作的原子性 因此在堆空间中也不一定全部都是数据共享的每个线程直接还存在着TLAB
6堆空间参数设置
在堆空间的参数设置主要有如下
内容链接地址-Xms初始堆内存-Xmx最大堆内存-Xmn新生代比例-XX:PrintFlagsInitial查看所有参数的默认值-XX:PrintFlagsFinal查看所有参数的最终值-XX:NewRatio设置新生代和老年代堆占比-XX:SurvivorRatio设置s区在Eden区占比-XX:MacTenuringThreshould设置新生代垃圾的最大年龄-XX:PrintGCDetails输出详细GC日志-XX:HandlePromotionFailure是否设置空间分配担保
如设置堆空间的初始大小和最大大小-Xms1024M -Xmx1024M
7逃逸分析(重点)
在java虚拟机中对象是在Java堆内存中分配的但是有一种特殊的情况那就是经过了逃逸分析后发现如果一个对象并没有套溢出方法的话那么就有可能被栈上分配这样就可能被优化成栈上分配。这样就无需进行堆上分配也就无需进行垃圾回收了。
7.1栈上分配
如何将堆上的对象分配到栈上需要使用到逃逸分析的手段这是一种可以有效的减少Java程序中同步负载和内存压力的跨函数全局数据流分析算法。
通过逃逸分析虚拟机的编译器可以分析一个新的对象的引用使用范围从而决定是否要将这个对象分配到堆上逃逸分析的基本行为就是分析对象的作用域 当一个对象在方法中被定义之后对象只在方法内部被使用则没有发生逃逸 当一个对象在方法中被定义之后他被外部所引用则认为发生逃逸
//没有发生逃逸分析
public Student test1(){//随着入栈出栈该对象被销毁对象分配在栈中Student stu new Student();return null;
}//发生了逃逸分析
public Student test2(){//该对象被外部所引用对象分配在堆中Student stu new Student();return stu
}在实际开发中能使用局部变量的就不要使用在方法外定义也不要考虑静态等问题这也是堆优化的策略之一
开启逃逸分析的命令-XX:DoEscapeAnalysis关闭则是-XX:-DoEscapeAnalysis
7.2同步省略
除了这个栈上分配对象之外JIT即时编译器也可以借助逃逸分析来判断同步块所使用的锁对象是否只能被一个线程访问而没有发布到其他线程如果没有那么这个JIT编译器就会取消堆这部分代码的同步这样就能大大的提高并发性能这个取消同步的过程就叫同步省略又名锁消除
public void test(){Student stu new Student();//发现每次调用该方法锁的根本不是同一个对象因此会将这个锁消除synchronized(stu){System.out.println(helloi stu);}
}7.3标量替换
逃逸分析也能实现这个标量替换标量指的就是无法再分解的更小的数据如Java原始的数据类型就是标量而还可以继续分解的对象化就被称为聚合量java的对象就被称为聚合量他为他还可以分解成标量或者其他聚合量
//聚合量是由标量和聚合量组成
public class User{ //聚合量int age; //标量String name; //标量Account account; //聚合量
}public Account{ //聚合量Double money; //标量
}而方法的局部变量是存在栈中的在JIT编译期间如果发现一个对象不被外界访问那么结果这个JIT的优化就会将这个对象拆分成一个个标量即对应的局部变量存储在栈帧里面。如这个Account对象只有一个money这一个局部变量存储在栈帧中而这个对象不存在这个行为就被称为标量替换
标量替换的开启如下-XX:EliminateAllocations 默认是打开的允许将对象打散分配在栈上。
8堆空间是分配对象的唯一选择吗(重点)
答案是是的在HotSpot虚拟机确实是这样子
上面7中重点是分析了一下这个逃逸分析的里面是有栈上分配和标量替换的栈上分配不就是将对象分配在栈上面随着方法的入栈出栈而销毁的吗
首先逃逸分析这项技术到如今是一门不成熟的技术其根本原因就是无法保证逃逸分析的性能销毁是否一定高于他的性能虽然通过逃逸分析可以实现标量替换、栈上分配、锁消除等但是逃逸分析自身也是需要进行一定系列的复杂分析的这其实也是一个相对耗时的过程。举个极端的例子就是在开启逃逸分析经过一顿分析之后发现没有一个对象是不逃逸的都被外面所引用着那么这个逃逸分析的分析过程就被白白的浪费掉了。
其次从逃逸分析的理论上来说pyc都是通过堆栈来存储对象所以逃逸分析确实是可以用的并且在jvm内部逃逸分析也是一项主要的调优手段。但是栈上是否会分配内存来保存那些未被逃逸的对象这取决于JVM设计者的选择而在官方的HotSpot虚拟机规范中明确指出该虚拟机中并没有这么做可以在逃逸分析的相关文档中查看因此也可以明确对象的实例都是创建在堆上的。
最后通过一段代码来说明
其jvm相关参数配置如下主要是通过-XX:-DoEscapeAnalysis 的加减号控制是否开启逃逸分析
//未开启逃逸分析
-Xmx1G -Xms1G -XX:-DoEscapeAnalysis -XX:PrintGCDetails
//开启逃逸分析
-Xmx1G -Xms1G -XX:DoEscapeAnalysis -XX:PrintGCDetails其代码如下 public static void main(String[] args) {long start System.currentTimeMillis();for (int i 0; i 10000000; i) {createUser();}long end System.currentTimeMillis();System.out.println(花费的时间为: (end - start) ms);try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}
}public static void createUser(){//对象未发生逃逸User user new User();
}可以发现不开启逃逸分析创建10000000个对象需要77ms而开启这个逃逸分析可以发现只需要4ms。并且可以通过这个通过jvisaulVm发现在开启逃逸分析之后stackAllocation的个数是1000万个而开启逃逸分析之后的个数只有几百甚至几十万个说明对象此时是随着方法入栈出栈而销毁了。那说明逃逸分析确实是可以将对象不分配在堆上面的但是HotSpot又明确说了不会在栈上分配内存因此只剩下一种解释标量替换如果将这一个个对象拆分成局部变量然后通过局部变量存储在栈帧上从而代替这里的对象然后随着栈帧的创建而创建随着栈帧的销毁而销毁。
总而言之就一句话逃逸分析理论确实可以存储在栈上但是在HotSpot虚拟机中还是只有堆分配对象而HotSpot是通过逃逸分析以及标量替换来实现栈上分配的但是栈上分配的并不是像堆一样完整的对象而是组成对象的各个标量 文章转载自: http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.pfnwt.cn.gov.cn.pfnwt.cn http://www.morning.jtmql.cn.gov.cn.jtmql.cn http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn http://www.morning.tkflb.cn.gov.cn.tkflb.cn http://www.morning.pwwjs.cn.gov.cn.pwwjs.cn http://www.morning.lkcqz.cn.gov.cn.lkcqz.cn http://www.morning.kdbcx.cn.gov.cn.kdbcx.cn http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.dmjhp.cn.gov.cn.dmjhp.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.bhbxd.cn.gov.cn.bhbxd.cn http://www.morning.gstg.cn.gov.cn.gstg.cn http://www.morning.qtzqk.cn.gov.cn.qtzqk.cn http://www.morning.hjrjr.cn.gov.cn.hjrjr.cn http://www.morning.bxgpy.cn.gov.cn.bxgpy.cn http://www.morning.hphrz.cn.gov.cn.hphrz.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.tnnfy.cn.gov.cn.tnnfy.cn http://www.morning.rlxnc.cn.gov.cn.rlxnc.cn http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn http://www.morning.mhnb.cn.gov.cn.mhnb.cn http://www.morning.xcyzy.cn.gov.cn.xcyzy.cn http://www.morning.fkdts.cn.gov.cn.fkdts.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.ztmnr.cn.gov.cn.ztmnr.cn http://www.morning.bpmfz.cn.gov.cn.bpmfz.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.tsrg.cn.gov.cn.tsrg.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.rgxf.cn.gov.cn.rgxf.cn http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.prprz.cn.gov.cn.prprz.cn http://www.morning.nylbb.cn.gov.cn.nylbb.cn http://www.morning.fswml.cn.gov.cn.fswml.cn http://www.morning.hxwrs.cn.gov.cn.hxwrs.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.qbtj.cn.gov.cn.qbtj.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn http://www.morning.mmhyx.cn.gov.cn.mmhyx.cn http://www.morning.pswzc.cn.gov.cn.pswzc.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.ztjhz.cn.gov.cn.ztjhz.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.dbxss.cn.gov.cn.dbxss.cn http://www.morning.mtcnl.cn.gov.cn.mtcnl.cn http://www.morning.sjgsh.cn.gov.cn.sjgsh.cn http://www.morning.nynpf.cn.gov.cn.nynpf.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.lyzwdt.com.gov.cn.lyzwdt.com http://www.morning.wncb.cn.gov.cn.wncb.cn http://www.morning.xdlwm.cn.gov.cn.xdlwm.cn http://www.morning.rkbly.cn.gov.cn.rkbly.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.lrylj.cn.gov.cn.lrylj.cn http://www.morning.smrkf.cn.gov.cn.smrkf.cn http://www.morning.qcrhb.cn.gov.cn.qcrhb.cn http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn http://www.morning.tkchm.cn.gov.cn.tkchm.cn http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.ltspm.cn.gov.cn.ltspm.cn http://www.morning.hptbp.cn.gov.cn.hptbp.cn http://www.morning.stcds.cn.gov.cn.stcds.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.ybshj.cn.gov.cn.ybshj.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.tsflw.cn.gov.cn.tsflw.cn http://www.morning.kzqpn.cn.gov.cn.kzqpn.cn http://www.morning.cwgt.cn.gov.cn.cwgt.cn http://www.morning.hympq.cn.gov.cn.hympq.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.kgfsz.cn.gov.cn.kgfsz.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.mlfmj.cn.gov.cn.mlfmj.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.kfwrq.cn.gov.cn.kfwrq.cn