G1垃圾收集器堆内存划分,垃圾收集各个阶段解析

15 篇文章 1 订阅
订阅专栏

G1(Garbage First Collector )

G1收集器官方文档

热点架构

HotSpot JVM具有一种体系结构,该体系结构支持强大的特性和功能基础,并支持实现高性能和大规模可伸缩性的能力。例如,HotSpot JVM JIT编译器会生成动态优化。换句话说,它们在Java应用程序运行时做出优化决策,并生成针对底层系统体系结构的高性能本机指令。此外,通过其运行时环境和多线程垃圾收集器的日趋完善和不断的工程设计,即使在最大的可用计算机系统上,HotSpot JVM仍可实现高可伸缩性。
在这里插入图片描述
JVM的主要组件包括类加载器,运行时数据区域和执行引擎

关键热点组件

下图突出显示了JVM中与性能有关的关键组件。
在这里插入图片描述
JVM的三个组件主要在调整性能时着重。该堆是你的对象数据的存储位置。然后,该区域由启动时选择的垃圾收集器管理。大多数优化选项都与调整堆大小和为您的情况选择最合适的垃圾收集器有关。JIT编译器对性能也有很大影响,但很少需要使用JVM的较新版本进行调整

评价系统指标重要的的两个因素

通常,在调整Java应用程序时,重点放在两个主要目标之一:响应性或吞吐量

响应能力

响应能力是指应用程序或系统对请求的数据做出响应的速度。示例包括:

  • 桌面用户界面对事件的响应速
  • 网站返回页面的速度
  • 数据库查询返回的速度

吞吐量

吞吐量专注于最大程度地提高应用程序在特定时间段内的工作量。如何测量吞吐量的示例包括:

  • 在给定时间内完成的交易次数。
  • 批处理程序在一小时内可以完成的作业数。
  • 一小时内可以完成的数据库查询数。

较高的用户停顿时间对于注重吞吐量的应用程序是可以接受的。由于高吞吐量应用程序会在更长的时间内专注于基准测试,因此无需考虑一时响应时间

G1垃圾收集器

垃圾优先(G1)收集器是一种服务器样式的垃圾收集器,目标是具有大内存的多处理器计算机。它极有可能满足垃圾回收(GC)暂停时间目标,同时实现高吞吐量。Oracle JDK 7更新4和更高版本完全支持G1垃圾收集器。G1收集器设计用于以下应用程序:

  1. 可以与CMS收集器之类的应用程序线程并行运行。
  2. 紧凑的自由空间,无需较长的GC引起的暂停时间
  3. 需要更多可预测的GC暂停时间。
  4. 不想牺牲很多吞吐量性能。
  5. 不需要更大的Java堆。

传统收集器只能在吞吐量(parallel scanvenge 收集器) 和 用户线程卡顿(CMS 收集器)取其一。而G1收集器取其中,在短时间满足最小化卡顿的同时满足高吞吐量

G1的优点

Oracle计划将G1作为并发标记扫描收集器(CMS)的长期替代产品。将G1与CMS进行比较,有一些差异使G1成为更好的解决方案。一个区别是G1是压紧收集器。G1足够紧凑,可以完全避免使用细粒度的空闲列表进行分配,而是依赖于区域。这大大简化了收集器的各个部分,并消除了潜在的碎片问题。此外,G1提供的垃圾收集暂停比CMS收集器更具可预测性,并允许用户指定所需的暂停目标

在这里插入图片描述
在这里插入图片描述

G1相对CMS的优势

在这里插入图片描述

传统垃圾收集器内存布局

非G1的垃圾收集器
在这里插入图片描述
所有内存对象最终都属于这三个部分之一。

G1垃圾收集器内存布局

在这里插入图片描述

  • 就是说 Eden,survivor,old 也存在 但是总的内存大小不固定,每个角色占据多少个region是不固定的
  • 也就是说上图中每个颜色都是一个regions,region之间不一定连续,每个region的可能的角色有三种 eden survivor old
  • 当执行垃圾收集时,G1以类似于CMS收集器的方式运行。G1执行并发全局标记阶段,以确定整个堆中对象的活动性。标记阶段完成后,G1知道哪些区域大部分为空(存在大量垃圾对象)。它首先收集在这些区域中,通常会产生大量的自由空间。这就是为什么这种垃圾收集方法称为“垃圾优先”的原因。顾名思义,G1将其收集和压缩活动集中在可能充满可回收对象(即垃圾)的堆区域。G1使用暂停预测模型满足用户定义的暂停时间目标,并根据指定的暂停时间目标选择要收集的区域数
  • 由G1标识为可回收的成熟区域是使用疏散收集的垃圾。G1将对象从堆的一个或多个区域复制到堆上的单个区域(如多个eden存活对象小于一个survivor内存大小
    就将其复制到survivor当中),并且在此过程中,压缩和释放了内存(在这过程被复制的region区域就会被释放掉)。复制是在多处理器上并行执行的,以减少暂停时间并增加吞吐量。因此,对于每个垃圾收集,G1都在用户定义的暂停时间内连续工作以减少碎片。这超出了前面两种方法的能力。CMS(并发标记扫描)垃圾收集器不执行压缩。ParallelOld垃圾回收仅执行整个堆压缩,这导致相当长的暂停时间。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

G1的RSet和CSet

如果从ParallelOldGC或CMS收集器迁移到G1,则可能会看到较大的JVM进程大小。这在很大程度上与“记账”数据结构有关,例如“已记忆集合(RSet)”和“收集集合(CSet)”。

  1. Remembered Sets or RSets 将对象引用跟踪到给定区域中。堆中每个区域都有一个RSet。RSet支持并行和独立地收集区域。RSets的总体影响小于5%。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上述的意思就是RSet其实就是哈希(hashTable)表,key记录是哪些region指向他 value记录的s是指向它的region的points-out.。 例如:regionA 的RSet 记录了regionB 此时这个RSet 的key 的值为RegionB;Value则是RegionB中指向其他区域的数据 。value是一个集合 可能他的索引只有一个是指向A,其他索引指向的是CD… 但是只要value中有一个索引指向了A 就会被RegionA的RSet记录,只不过key代表被谁指向,而value则是这个谁他所指向的区域 不一定所有索引都指向regionA但至少有一个指向A,即RSet相当于A来说B为A的points-into 为key,value相当于B来说就是B的points-out 其中至少存在一个内存对象指向A

该Rset 是Eden中记录哪些Old指向它,young GC时就只扫描指向他的GC即可

  1. Collection Sets or CSets 在GC中收集的区域集。GC期间,将(复制/移动)CSet中的所有存活数据,区域集可能是Eden,survivor,old。CSets对JVM的大小影响不到1%。

在这里插入图片描述

G1的推荐用例

G1的首要重点是为运行需要大堆且GC延迟有限的应用程序的用户提供解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒

如果当前具有CMS或ParallelOldGC垃圾收集器的应用程序具有以下一个或多个特征,则将其切换到G1将非常有益。

  1. 完整的GC持续时间太长或太频繁。
  2. 对象分配率或晋升率差异很大
  3. 不必要的长时间垃圾收集或压缩暂停(停顿长于0.5到1秒)
    注意:如果您使用的是CMS或ParallelOldGC,并且您的应用程序未经历长时间的垃圾收集暂停,则可以保留当前的收集器。使用最新的JDK不需要更改为G1收集器。
    在这里插入图片描述

G1堆结构

G1收集器采用了另一种分配堆的方法。后续图片逐步检查了G1系统。

G1堆结构

堆是一个内存区域,分为多个固定大小的区域。
在这里插入图片描述
区域大小由JVM在启动时选择。JVM通常针对大约2000个区域,大小从1到32Mb不等。

堆分区

实际上,这些区域被映射为Eden,survivor和old空间的逻辑表现形式
在这里插入图片描述
图片中的颜色显示了哪个region与哪个角色相关联。将活动对象从一个区域撤离(即复制或移动)到另一个区域。区域被设计为:在不停止所有其他应用程序线程的情况下并发收集就是说区域垃圾在收集时和用户线程是并发的

如图所示,可以将区域分配到Eden,幸存者和旧时代区域。此外,还有第四种类型的物体被称为巨大区域(Humongous )。这些区域旨在容纳标准区域大小的50%或更大的对象。它们存储为一组连续区域(G1会有特殊的处理办法)。最后**,最后一种区域类型是堆的未使用区域**。

注意:在撰写本文时(Orecle),尚未优化收集大型对象的过程。因此,应避免创建这种大小的对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

G1的年轻代

堆分为大约2000个区域。最小大小为1Mb,最大大小为32Mb。蓝色区域保存旧对象,绿色区域保存年轻对象。
在这里插入图片描述
请注意,区域不需要像旧的垃圾收集器那样连续

G1中的年轻GC

当堆内存不足以为对象分配内存,将存活的对象撤离(即复制或移动)到一个或多个幸存者区域。如果满足老化阈值,则某些对象将被提升到老年代意思就是说新生代的GC存活的对象如果不够一个survivor存储可以存储多个survivor,其中超过年龄阈值的对象另外存放在老年代区域

在这里插入图片描述
这里**用户线程(会STW)停顿。需要考虑诸如用户定义的停顿时间目标**之类的事情。为下一个年轻GC计算Eden大小和survivor大小。保留会计信息以帮助计算大小。

这种方法使调整区域大小变得非常容易,可以根据需要增大或缩小区域。

带有G1的年轻GC结束

存活对象已被疏散到幸存者区域或老年代区域。在这里插入图片描述
最近晋升的对象以深蓝色显示。幸存者区域为绿色。

综上所述,关于G1的年轻一代,可以说以下几点:

  • 堆是单个内存空间,分为多个区域。
    -年轻代内存由一组非连续区域组成。这使得在需要时易于调整大小(可直接在未使用内存拿到想要的内存)。
  • 年轻代的垃圾收集器在初始标记时会STW。将停止所有应用程序线程以进行操作。
  • 年轻的GC(垃圾回收时 区别初始标记)使用多个线程并发完成。
  • 将活动对象复制到新的幸存者或老年代的region。

G1垃圾收集器阶段

G1收集器采用了另一种分配堆的方法。后续图片逐步检查了G1系统。

1.初始标记(Initial Marking Phase)

与cms类似用来标记被roots和新生代引用的老年代对象

在这里插入图片描述

2.并发标记(concurrent Marking Phase)

如果找到空白region(如“ X”所示)则在“remark”阶段将其立即删除。另外,计算确定活跃度的“accounting”的信息

在这里插入图片描述

3.重新标记(Remark Phase)

空区域将被删除并回收。现在重新计算所有区域的区域活跃度
在这里插入图片描述

4.复制/清理阶段(Copying/Cleanup Phase)

G1选择“活度”最低的区域(就是引用少垃圾多),这些区域可以被最快地收集。然后与年轻的GC同时收集这些区域。这在日志中表示为[GC pause (mixed)]。因此,年轻代和老年代都被同时收集。
在这里插入图片描述

5.复制/清理阶段之后(After Copying/Cleanup Phase)

选定的区域已被收集并压缩为图中所示的深蓝色区域和深绿色区域。改蓝色和深绿色代表的是对应区域的存活对象是被压缩分配到该区域所占的内存
在这里插入图片描述
总之,关于旧一代的G1垃圾收集,我们可以提出一些关键点。

  • 并发标记阶段
    活动信息是在应用程序运行时同时计算的。
    该活动信息标识在疏散暂停期间最适合回收的区域。
    没有像CMS中那样的清扫阶段。

  • 重新标记阶段
    使用开始快照(SATB)算法,该算法比CMS使用的算法快得多。
    完全回收空区域。

  • 复制/清理阶段
    同时回收年轻一代和老一代。
    老年人地区是根据其活跃度来选择的。

垃圾回收G1收集过程
互联网架构师笔记
04-03 2158
G1 中提供了 Young GC、Mixed GC 两种垃圾回收模式,这两种垃圾回收模式,都是 Stop The World(STW) 的。G1 没有 fullGC 概念,需要 fullGC 时,调用 serialOldGC 进行全堆扫描(包括 eden、survivor、o、perm)。
G1垃圾收集器堆内存划分与角色分派【纯理论】
weixin_30916125的博客
07-03 158
接着上一次【https://www.cnblogs.com/webor2006/p/11123522.html】G1学习继续开启理论之旅。。 G1的设计规划是要替换掉CMS【理想化的】 G1在某些方面弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要管理内存碎片。 另外,G1提供了更多手段,以...
大白话详解G1垃圾回收
最新发布
不是很懂
08-23 1412
通俗语言讲解G1垃圾回收器通过分代管理和Region划分优化堆内存管理,采用三色标记法进行垃圾回收,支持动态调整内存和设置停顿时间。
G1分配大内存测试
alterhz的博客
07-07 734
package org.ziegler.gc; /** * VM参数:-XX:+UseG1GC -Xms20M -Xmx20M -Xmn10M -Xlog:gc* -XX:SurvivorRatio=8 * */ public class FirstTestGC { public static void main(String[] args) { byte[] a1, a2, a3, a4; a1 = new byte[2 * 1024 * 1024]; .
89-G1垃圾收集器内存划分与角色分派
qq_40574305的博客
05-27 208
G1垃圾收集器内存划分与角色分派 G1的设计规划是要替换掉CMS G1在某些方面弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要管理内存碎片。 另外,G1提供了更多手段,已达到对GC停顿时间的可控。 Hotspot虚拟机主要构成 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HkFQg3Xn-1590580803727)(assets/1580626178999.pn
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
weixin_45101064的博客
03-20 2327
引言    在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析,但在开始前,先来看看JDK的发布记录中关于GC体系的改变: 2018年9月:JDK11发布,引入Epsilon垃圾回收器,又被称为"No-0p(无操作) "回收器。同时,引入了可伸缩的低延迟垃圾回收器ZGC(Experimental)。 2019年3月:JDK12发布,增强G1收集器,实现自动返还未用堆内存给操作系统。同时,引入了低停
Java语言垃圾收集器解析:策略与内存管理
例如,新生代和老年代的划分,以及使用哪种垃圾收集器进行哪部分的内存清理,都会影响整体性能。 为了优化垃圾收集的性能,开发者可以通过调整JVM参数,如设置堆大小、新生代与老年代的比例、开启并发模式等来定制...
深入解析G1垃圾收集器:优势与工作原理
这种设计允许G1收集器更灵活地处理内存分配和垃圾回收。 与传统的CMS收集器相比,G1的一个显著优势是其空间整理能力。CMS在进行垃圾回收时可能会产生内存碎片,而G1通过Region间的移动对象来避免这个问题。此外,G1...
JavaOne: G1 垃圾收集器深度解析
"这篇博客文章主要讨论了Zz JavaOne会议上关于G1垃圾收集器的演讲,由Sun Microsystems的Tony Printezis和Chicago Board Options Exchange的Paul Ciciora共同介绍。G1是一款低延迟的垃圾收集器,适用于Java Hotspot...
G1垃圾收集器详解:原理、切换与日志配置
最后,重点讲解了如何配置G1收集器以记录详细的GC日志,这对于理解和优化性能至关重要。通过日志分析,开发者可以跟踪G1的行为,发现潜在问题并进行调优。 在学习前,读者需要具备一定的硬件和软件环境,如Windows ...
[原创]JVM垃圾回收机制和常见垃圾收集器-CMS、G1、ZGC
Minor的Java技术博客
06-27 1896
现代大部分的虚拟机的垃圾回收器都遵循“分代收集”的理论基础来进行设计实现: 根据这个理论基础,JVM的大部分虚拟机将堆空间逻辑划分为新生代/年轻代、老年代,垃圾收集器可以根据不同的区域选择不同的回收算法进行GC。 将内存分隔为两块相同大小的区域,每次只使用其中的一块,每当GC完成后,将存活的对象复制到另一块区域,然后将前一块清空。分为标记和清除两个阶段,标记存活的对象,然后GC清除掉没有被标记的对象。这种算法实现简单,但是有2个缺点...
JVM垃圾收集-G1GC 区域化分代式
存在,即合理
05-25 1146
G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征。在JDK1.7版本正式启用,移除了Experimental的标识,是9以后的默认垃圾回收器,取代了CMS回收器以及Parallel+Parallel old组合。被0racle官方称为“全功能的垃圾收集器”。与此同时,CMS己经在JDK9中被标记为废弃(deprecated)。
JVM学习----垃圾回收--G1
m0_48639280的博客
08-01 647
2004论文发布---->2009JDK6u14体验---->2012JDK7u4官方支持---->2017JDK9默认相关JVM参数-XX+UseG1GC-XX-XX。
垃圾收集器和内存分配
owen_william的博客
03-26 888
1.串行回收器 串行回收器是指使用单线程进行垃圾的回收。每次回收时,串行回收器只有一个工作线程,对于并行能力软弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。 1.1新生代串行回收器 1)        串行回收器主要有两个特点:         a)        它仅仅使
JVM学习笔记——G1
程铭程铭你快成名的博客
12-25 1881
什么是G1 Garbage-First收集器是一个并行、并发和增量压缩低停顿的垃圾收集器G1Java堆布局和HotSpot VM中其他垃圾收集器有着极大的不同,它将Java的堆分成相同的块(称为区域,Region)。 G1也是分代的,但整体上没有划分成新生代和老年代。相反,每代是一组(可能不连续)的Region,这使得它可以灵活地调整新生代。 为什么需要了解G1? 因为G1是JDK 11默认...
堆外内存泄漏排查
liuhstop1的博客
06-07 1094
查看相关代码 涉及到这个调用的是 Jackson 的反序列化为 map 的时候 对 key 做了这个操作,用来减少内存占用空间。线上的兜底 job 服务监控显示每天以 1% 的速度内存增长,直到 90% 以上,需要手动重启。可以很明显看到主要是 Symbol 区 Stringtable 的增长 也就是 String.Intern 的调用。3. 使用 Java 的 Unsafe 类做一些分配本地内存的操作 不好控制 主要在 Intern 区。1. 禁用相关,重启后再进行观察,不再出现相关堆外内存泄漏。
16.7 垃圾回收器 - G1回收器:区域化分代式
u013559614的博客
03-18 897
G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1 ) GC? 原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。G1 (Garbage- First)垃圾回收器是在Java7 update 4之 后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。 与此同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进
G1收集器详解
荷兰豆_的博客
08-23 2132
CMS垃圾收集器的弊端:会产生内存碎片 && 需要预留空间。 这两个问题在处理时,很有可能会导致停顿时间过长,即CMS的停顿时间不可预知。 所以G1又可以理解为在CMS垃圾收集器上进行了"升级"。 G1垃圾收集器可以给你设定一个你希望Stop the world停顿时间,G1会根据这个时间尽量满足你。 在JVM堆中,堆的内存分布是以物理空间进行隔离—— 但是在G1垃圾收集器中,堆的划分不再是物理形式,而是以逻辑的形式进行划分。 但是,分代的概念在G1中依旧奏效,比如,新对象一般会被分配.
G1与ZGC
ariestse9的博客
01-25 1501
G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region,比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收。存活的对象越多,回收垃圾的效益比越低。G1垃圾收集器对于对象什么时候会转移到老年代根之前讲过的原则一样,唯一不同的是对大对象的处理,G1有专门的大对象存储区Humongous,当放到Eden区时超过50%,则放到Humongous区。
写文章

热门文章

  • SpringBoot如何对外暴露接口,供其它项目调用 24966
  • maven 解决Cannot access alimaven (http://maven.aliyun.com/nexus/content/repositories/central/) 17456
  • 查询对象中存在List集合 如何返回给前端 8309
  • SpringApplication.run(MyApplication.class, args)运行流程源码分析 8266
  • brew更新提示:fatal: not in a git directory 如何解决 7628

分类专栏

  • 数据库
  • 并发 9篇
  • 问题解决 21篇
  • springBoot/Cloud 18篇
  • JavaSE 10篇
  • Spring 3篇
  • JVM 15篇
  • java8 11篇

最新评论

  • maven 解决Cannot access alimaven (http://maven.aliyun.com/nexus/content/repositories/central/)

    少川-: 问题已解决,谢谢博主

  • 并发场景多个线程统一全局超时时间

    发了个版: 这个无所谓,可以不写或者指定长度为list的size

  • 并发场景多个线程统一全局超时时间

    阳光怪兽: 请教下第三种方法,里面数组的长度为什么是6

  • Java8使用Lambda将一个List均分成指定n个List

    leisdelta: 这个验证2,4传入的结果一样变成[[],[]]有问题,不知道要怎么调整

  • maven 解决Cannot access alimaven (http://maven.aliyun.com/nexus/content/repositories/central/)

    qq_32687907: 问题已解决,感谢博主

大家在看

  • Vue项目的分页组件封装
  • mui+vue.js项目笔记 70
  • spring cloud 服务调用学习笔记(含最佳实践代码)feign实现
  • Linux-shell实例练习
  • BOM管理:制造业效率与质量的保障

最新文章

  • brew更新提示:fatal: not in a git directory 如何解决
  • InstantiationAwareBeanPostProcessor使用注意事项
  • 模仿Autowired生成一个自定义接口代理对象的后处理器
2022年1篇
2021年7篇
2020年66篇
2019年34篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家淄博玻璃钢广场雕塑定制商场雕塑卡通人物玻璃钢雕塑深圳装饰商场美陈厂家直销曲阳室外玻璃钢雕塑太湖石玻璃钢人物雕塑制作玻璃钢雕塑模具汕尾人物玻璃钢卡通雕塑淄博玻璃钢动物雕塑吉林玻璃钢广场雕塑嘉兴欧式玻璃钢雕塑价位玻璃钢景观雕塑现货供应柳州玻璃钢雕塑价格福建玻璃钢雕塑工艺品广东玻璃钢高跟鞋雕塑玻璃钢雕塑 彩色锻茂名玻璃钢雕塑直销价格商场休息区美陈方案安国玻璃钢仿铜雕塑玻璃钢卡通小白兔雕塑宜兰玻璃钢雕塑藤县玻璃钢雕塑价格醉八仙 玻璃钢 雕塑丹阳商场美陈布置梅州玻璃钢花盆厂家南通如东玻璃钢雕塑加工公司天津景观玻璃钢雕塑销售电话福建商场美陈生产厂家湘潭玻璃钢花盆江苏景观灯玻璃钢花盆河北玻璃钢小品雕塑维修翻新香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化