g1gc调优的一次实战记录

26 篇文章 15 订阅
订阅专栏

Java内存区域 或 JVM 内存结构

JVM内存区域
线程共享

  • 方法区
  • 直接内存
  • (非运行时数据区的一部分)
    线程私有
  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
    JDK 8 版本之后方法区(HotSpot 的永久代)被彻底移除了(JDK7 就已经开始了),取而代之是元空间
    新的一个图

识别垃圾

  • 1,引用计数法(Reference Counting)
  • 2,可达性分析,又称引用链法(Tracing GC)

GC算法

  • 1,Mark-Sweep(标记-清除)
    产生碎片
  • 2,Copying(复制)
    空间利用率不高的缺点,另外就是存活对象比较大时复制的成本比较高
  • 3,Mark-Compact (标记-整理)
    好理论,解决1,2 gc算法的不足
  • X,分代收集算法
    正规的算法,就是1、2、3,这个分代算是灵活运用上面的三种。
    一般将堆分为新生代和老年代。
    新生代使用: 复制算法
    老年代使用: 标记 - 清除 或者 标记 - 整理 算法

G1GC

  • G1 GC是Java HotSpot虚拟机的低暂停服务器风格分代垃圾收集器,适用于具有大内存的多处理器计算机。G1 GC使用并发(concurrent)和并行(parallel)阶段来实现其目标暂停时间并保持良好的吞吐量。
  • 全堆操作(例如全局标记)与应用程序线程并行执行。这样可以防止与堆或活动数据大小成比例的中断。
  • G1是一个有整理内存过程的垃圾收集器,在回收垃圾的时候会压缩存活对象。不会产生很多内存碎片。
  • G1的Stop The World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间。

G1GC的设计目标

  • 与应用线程同时工作,几乎不需要stop-the-world(与CMS类似);
  • 整理剩余空间,不产生内存碎片;(CMS只能在full-GC时,用stop-the-world整理碎片内存)
  • GC停顿更加可控;
  • 不牺牲系统的吞吐量;
  • gc不要求额外的内存空间(CMS需要预留空间存储浮动垃圾);

什么是STW

不管选择哪种GC算法,stop-the-world都是不可避免的。Stop-the-world意味着从应用中停下来并进入到GC执行过程中去。一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。GC调优通常就是为了改善stop-the-world的时间

G1是要替换掉CMS

CMS算是分代收集器,在JDK9 被标记弃用,JDK14 被删除,G1GC则是分区收集器,在某些方便弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要使用free-list去管理内存碎片。另外,G1提供了更多手段,以达到对gc停顿时间可控。
GC收集器大分类
目前在 Hotspot VM 中主要有分代收集和分区收集两大类,具体可以看下面的这个图,不过未来会逐渐向分区收集发展。

并发(concurrent)和并行(parallel)

  • 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)
  • 在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)
  • 并发:意味着应用程序同时(并发)在一项以上的任务上取得进展,尽力压榨一个CPU的处理能力,抢占更多的执行时间片
  • 并行:应用程序将其任务分解为较小的子任务,这些子任务可以并行处理,例如在多个CPU上同时进行。重点是多个CPU。

G1GC Region

  • 传统的GC收集器将连续的内存空间划分为新生代、老年代和永久代(JDK 8去除了永久代/PermGen,引入了元空间Metaspace),这种划分的特点是各代的存储地址(逻辑地址)是连续的。
  • G1 GC是一个区域化的代垃圾收集器
  • G1也是分代管理内存的,他的各代存储地址是不连续的,每一代都使用了n个不连续的大小相同的Region,每个Region占有一块连续的虚拟内存地址。
  • G1最大的特点就是高效的执行回收,优先去执行那些大量对象可回收的区域(region)
  • G1使用了停顿预测模型,来满足用户设定的gc停顿时间,根据用户设定的目标时间,g1会自动的选择哪些region要清除,一次清除多少个region。
  • G1从多个region中复制存活的对象,然后集中放入一个region中,同时整理、清除内存(copying收集算法)。

G1GC 停顿预测模型

  • 机器学习听说过吧,这个G1GC里面这个停顿预测模型,就类似这个机器学习,自行训练,自己判断每次回收谁,回收多少。
  • G1 uses a pause prediction model to meet a user-defined pause time target and selects the number of regions to collect based on the specified pause time target.
  • G1 GC是一个响应时间优先的GC收集器,它与CMS最大的不同是,用户可以设定整个GC过程的期望停顿时间,参数-XX:MaxGCPauseMillis指定一个G1收集过程目标停顿时间,默认值200ms,不过它不是硬性条件,只是期望值。那么G1怎么满足用户的期望呢?就需要这个停顿预测模型了。G1根据这个模型统计计算出来的历史数据来预测本次收集需要选择的Region数量,从而尽量满足用户设定的目标停顿时间。

G1GC内部三种形式的GC

Young GC (STW)

Eden区耗尽的时候就会触发新生代收集,新生代垃圾收集会对整个新生代(E + S)进行回收

  • 新生代垃圾收集期间,整个应用STW
  • 新生代垃圾收集是由多线程并发执行的
  • 通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。
  • 新生代收集结束后依然存活的对象,会被疏散evacuation到n(n>=1)个新的Survivor分区,或者是老年代。

Mixed GC (STW)

  • Stop The World
  • 选定所有年轻代里的Region,外加根据global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region
  • Mixed GC不是full GC,它只能回收部分老年代的Region,如果mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC,就会使用serial old GC(full GC)来收集整个GC heap
    什么时候Mixed GC

FULL GC (STW)

  • Stop The World
  • 如果mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC,就会使用serial old GC(full GC)来收集整个GC heap。
  • G1是不提供full GC的。这个serial old GC full gc是单线程的(在Java 8中)并且非常慢,因此应避免在G1 gc的时候出现这个full gc
  • 不能觉得用了G1gc收集器之后,Java heap里面的gc不是young gc 就mixed gc,还有这个full gc呢
  • G1GC发生了Full GC,就说明当前程序的运行是问题的,就得考虑为什么会Full GC 了

G1GC 支持的配置参数以及默认值

G1GC 支持的配置参数以及默认值
G1GC 支持的配置参数以及默认值

es7的jvm参数配置

-Xms4g -Xmx4g -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30
-XX:InitiatingHeapOccupancyPercent=45
设置触发全局并发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。es7调小这个默认值,希望提前触发全局标记降低full gc的风险
-XX:G1ReservePercent=10
设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。增加或减少百分比时,请确保对总的 Java 堆调整相同的量,es7调大这个值,扩大预留空间。

G1 调优建议

  • 不要显式的设置新生代的大小(用Xmn或-XX:NewRatio参数)
  • -XX:ConcGCThreads=n 设置并行标记的线程数。将n设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右。
  • -XX:ParallelGCThreads=n 设置 STW 工作线程数的值。将 n 的值设置为逻辑处理器的数量。如果逻辑处理器不止八个,则将n的值设置为逻辑处理器数的 5/8 左右。

G1的推荐使用场景

  • G1的首要重点是为运行需要大堆且GC延迟有限的应用程序的用户提供解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒。
  • 如果当前具有CMS或ParallelOld垃圾收集器运行的应用程序具有以下一个或多个特征,则将其切换到G1将非常有益。
  • 超过50%的Java堆被实时数据占用。
  • 对象分配率或提升率差异很大。
  • 不必要的长时间垃圾收集或压缩暂停(长于0.5到1秒)

CMS 和 G1 对比

cms和g1对比
CMS不能解决Old区的碎片化问题,导致一定会出现长时间停顿的FullGC

G1与CMS相比的优势

  • 1、并行和并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
  • 2、分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。它能够采用不同的方式去处理新创建的对象和已经存活了一段时间,熬过多次GC的旧对象以获取更好的收集效果。
  • 3、空间整合:与CMS的“标记–清理”算法不同**,G1从整体来看是基于“标记-整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
  • 4、可预测停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。

什么时候GC

  • 内存不够用了

对象何时进入老年代

  • 1,迭代年龄判断 (都知道)
    这个针对的是一个对象长时间存在引用关系,最终在young区来回copy,当年纪大了,就进去old区了。
  • 2,大对象直接进入老年代(不常见)
    超过单个region区域一半大小的对象,为避免在young区来回的copy,在new的时候直接给安排到old区。
  • 3,YoungGC之后需要移区的对象放不下(基本想不到)
    一般推荐使用G1GC,那都是堆比较大的程序,多半都是处理大量数据的程序,既然是大量数据,
    那么young区满的速度是贼快的,刷刷刷的就满了。若程序运行支持,前脚创建完对象,后脚立马就使用完了,
    那么YoungGC可以很快的回收young区的内存,Old区也不会出现大量的对象。
    这个时候Young区和Old区比例,应该是Young占比比较大才对。
    问题就是对象创建完之后,不是很快的结束引用,这个对象就要在Young区来回的copy,当s区不够的时候,
    他就会被安排到Old区,对象一旦被copy到old区之后,那就只能被Mixed GC或者Full GC来回收了,
    但是Mixed GC又不是完全的回收Old区的所有没有被引用的对象,他只是挑选一部分回收价值大的region去回收。
    问题的关键就在这,
    Mixed GC
  • 1,不是频繁的执行的,
  • 2,他还不是回收所有能回收的。当堆内存大量存在可被回收的对象的时候,就会出现浪费的现象。
    一直憋着,直到触发Full GC,STW,来一次大清理。

G1GC发生Full GC之后往哪思考

堆里的数据是什么

  • 写代码的人知道程序中什么数据的对象占比最大
  • 现在的问题就是对象积压而不是泄露。因为像内存泄露之类的,是会有OOM的异常的。
  • new 对象的速度是不是杠杠滴,而且特定时间段,数据量飙升且巨大的时候才频繁的Full GC。

为什么会一直存在引用

  • 1,数据写不出去,没办法释放引用
    比如我这程序是处理完数据之后要写es,写kafka,瞬间数据量就急剧飙升,但是写出的速度不变的。
    单纯的增加程序的运行内存,程序内部的缓存都是不行的。
    必须想办法加快数据的流出,比如增加es的data节点,或者es机器换固态硬盘,加机器。
    我这写es慢的解决是es的data节点换了固态硬盘。
    写kafka慢,是因为jvm参数设置的不对,添加了 -Xmn,限制了G1GC的黑科技运行。
  • 2,思考什么数据、什么情况下会进入到Old区
    因为一旦到了Old区,相比Young区的回收,Old区的回收,速度就不会很快,量也不会很大。
    我这就是设置了 -Xmn之后,限制了New size的大小,程序在数据量急剧飙升的时候,E区会极其频繁的new对象。
    但是还没来得及释放,就得被copy到O区了,一旦被copy到O区就发生了上述的问题。

G1GC实际调优例子

测试程序的jvm参数设置是 -Xmn4G -Xms4G -Xmn64M -XX:+UseG1GC
设置Xmn的Heap情况
分析:

  • 这使用了G1GC的收集器,但是使用了-Xmn 设置了 NewSize的大小
  • 看这个进程的gc情况,每秒都进行10次上下的YGC,很频繁。
  • 看OU是在默默的一点点的增长着呢,预计一下:长着长着,就会塞不下,然后触发full gc了
    删除掉 -Xmn设置之后的heap情况
    删除掉 -Xmn设置之后的heap情况
    分析:
  • 删掉 -Xmn的设置之后的堆内存分布
  • newSize最大可以到 2456MB
  • 4096(Heap) = 2576(E) + 4(S) + 1516(O)
  • 自动分配之后,Y区占比变大,占比 62%
    删除掉 -Xmn设置之后的GC情况
  • 看YGC列,执行次数明显变少几秒钟一次YGCGCT也增长的很慢
  • 再观察OU,有增有减。说明有Mixed GC在执行
  • SEO各区的大小是浮动的
  • 为啥 S0C 和 S0U一直是0?
    结论
    用这个例子,实际验证了 G1GC的调优建议中的不要设置New size的大小,因为这个会限制G1GC内部的停顿预测模型的工作,他牛就牛在这个模型上。

对比一下CMS GC

删除掉 -Xmn设置之后的GC情况
S0 和S1是交替在使用,在YGC的时候,有个互相copy的过程

后端调优基础——GC调优
javalingyu的博客
05-26 641
GC类型 Minor GC:清理新生代,Minor GC是最频繁触发的GC,速度也最快的,主要工作原理是: 对象在young区的eden创建,当eden空间满后触发Minor GC,将还存活的对象复制到一个survivor0中,另一个survivor1也会将对象复制过去,然后对eden和survivor1进行全部清理,survivor0和survivor1就这样不断交替,总有一个是空着的,当对象放不下或者是对象年龄足够老(默认15)会将其放入Old区,由此可见Minor GC时不但会清理对象,还会将对.
G1最佳实践
weixin_30439131的博客
07-07 304
示例 -Xms1550m -Xmx1550m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -verbosegc -XX:+PrintGCDateStamps -Xloggc:ideagc.log -XX:MaxMetaspaceSize=428m G1的堆是一整个, yong old是不连续的块 最好不要设置-Xmn XX:NewRatio ... 统计算法不同,...
JVM&g1gc;带书签,完整版本
12-21
最新的G1学习资料,JVM&g1gc;带书签,完整版本,好书。
G1处理器GC调优常用参数详解
最新发布
m0_49200907的博客
08-21 917
G1 垃圾收集器会根据新生代空间不足、老年代占用空间超过阈值,以及达到 Mixed GC 周期等情况,来触发 Mixed GC。Mixed GC 是一种增量式的垃圾收集策略,可以有效地回收整个堆内存中的垃圾,并控制垃圾收集的停顿时间。
深入理解G1垃圾收集器
qqqqq1993qqqqq的博客
05-13 4413
(http://blog.jobbole.com/109170/) 了解G1 G1的第一篇paper(附录1)发表于2004年,在2012年才在jdk1.7u4中可用。oracle官方计划在jdk9中将G1变成默认的垃圾收集器,以替代CMS。为何oracle要极力推荐G1呢,G1有哪些优点? 首先,G1的设计原则就是简单可行的性能调优 开发人员仅仅需要声明以下参数即可:
G1垃圾回收 案例 实战
stevewong的专栏
04-16 577
翻译以下这个视频讲述的案例:https://youtu.be/Gee7QfoY8ys 这是一个在线下棋应用 20k requests/s - 使用的Jetty server 1 server, 64 GiB RAM, 2x16 cores Application Rate: 0.5-1.2 GiB/s 从CMS迁移到G1 问题1:MetaSpace 使用了13.72秒做Full GC 简单的修复...
阿里P8首推JVM&GC手抄白皮书,实战案例+源码,难点盲点一网打尽
xingduan5153的博客
05-27 485
JVMJava语言可以跨平台、保持高发展的根本,没有了 JVM, Java语言将失去运行环境。针对 Java 程序的性能优化一定不可能避免针对JVM调优,随着 JVM 的不断发展,我们的应对措施也在不断地跟随、变化,内存的使用逐渐变得越来越复杂。所有高级语言都需要垃圾回收机制的保护,所以 GC 就是这么重要。 而不是仅仅针对 Java 虚拟机和 GC 调优进行讲解,也力求每一章节都有实际的案...
JVM实战-G1调优
白云
08-10 3745
G1调优 G1的一个重点是为运行需要大量堆且GC延迟有限的应用程序的用户提供一个解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒。 1)判断是否需要使用G1收集器? 官方描述 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/G1.html#use_cases 1、超过50%的Java堆内存被实时数据占用 2、对象分配或晋升的速度差异显著 3、长时间垃圾收集或压缩暂停(超过0.5到1秒) 2)不要手动设
深入理解JVM GC调优:算法与实战
JVM GC调优旨在优化这一过程,提高应用性能,减少停顿时间,以及更有效地利用内存资源。 JVM的体系结构由多个子系统组成,包括: 1. **类装载器子系统(Classloader)**:负责加载类文件,确保类的唯一性,并将字节...
G1 GC性能优化实战:深度解析与调优策略
作者还分享了G1 GC调优的具体实践案例,包括如何解决并发标记期间的正确性问题,如Mutator对象关系修改的同步问题。书中提到的SATB(Semi-space Tenuring Algorithm)算法是G1 GC的核心,它的核心原则是新分配的对象...
优化Spark应用:GC调优实战与内存管理策略
"GC调优在Spark应用中的实践"这一主题聚焦于Spark框架中垃圾回收机制的重要性。Spark作为一种内存计算驱动的大数据处理框架,其核心特性决定了它对内存管理和JVM垃圾回收器(GC)的依赖。Spark在处理大规模数据时,...
Java内存管理与GC调优实战
对象在年轻代经过几次GC周期后仍然存活,将被提升至老年代。 老年代则存放长期存活的对象,当其空间不足时,会触发Major GC,也称为Full GC。由于涉及的对象多且复杂,Major GC的执行时间较长,可能导致应用程序...
转:深入理解Java G1垃圾收集器
z69183787的专栏
09-13 792
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践。 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放这些对象占用的内存 1,查找内存中不再使用的对象 那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法: 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可
从CMS到G1:LinkedIn个人主页调优实战
阿杜的世界
07-09 360
本文转载自公众号:阿飞的博客,阅读大约需要13分钟。阿飞是我认识几年的好友,对技术有很强的专研精神,跟他讨论GC问题的时候一些观点都很深刻。LinkedIn中的个人主页是...
[译]GC专家系列3-GC调优
weixin_33852020的博客
01-14 462
原文链接:http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collection/ 本篇是GC专家系列的第三篇。在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别。所以,你应该已经了解了JDK 7中的5种...
G1调优常用参数及其作用
热门推荐
点滴之积
02-12 1万+
G1调优参数及其作用机制
G1 GC 调优学习 了解有关如何调整和调整G1 GC以进行评估,分析和性能的信息。
请叫我大师兄
06-27 3083
G1 GCJava HotSpot虚拟机的低暂停,服务器风格的分代垃圾收集器。G1 GC使用并发(concurrent)和并行(parallel)阶段来实现其目标暂停时间并保持良好的吞吐量。当G1 GC确定需要进行垃圾收集时,它将首先收集存活数据最少的区域(垃圾优先处理)。 垃圾收集器(GC)是一种内存管理工具。G1 GC通过以下操作实现自动内存管理: 在年轻一代分配对象,并将老化的对象提升为老一代。 在并发(并行)标记阶段,在老一代中查找存活对象。当Java堆总占用量超过默认阈值时,Java H.
G1垃圾收集器(六) 之 命令行选项和最佳实践
z69183787的专栏
06-20 1191
命令行选项和最佳实践 在这个章节,让我们一起看看G1的每个命令行选项。 基本的命令行选项 启用G1 GC,使用选项:-XX:+UseG1GC 这是一个最简单的命令行,来启动下载的JDK自带的demos和例子中的Java2Demo java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar c:\javademos\dem...
写文章

热门文章

  • Java 枚举(enum) 详解7种常见的用法 867001
  • java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串 378418
  • IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结 351447
  • Intellij IDEA 2017 debug断点调试技巧与总结详解篇 266901
  • Java中字符串indexof() 的使用方法 265577

分类专栏

  • jvm 26篇
  • 并发 19篇
  • design pattern 12篇
  • flume | kafka | storm | flink 29篇
  • java 146篇
  • intellij idea 62篇
  • linux 15篇
  • spring 50篇
  • css | js | html 55篇
  • elasticSearch 13篇
  • git | github | svn 18篇
  • guava 10篇
  • http | https 18篇
  • json | log4j | jdbc 11篇
  • maven | gradle 24篇
  • mongodb | mysql 24篇
  • poi | sigar | vertx 5篇
  • 面试题 43篇
  • 扩展阅读 41篇

最新评论

  • Java泛型:<? extends XXXX> 中的? 和 extends 的理解和使用实例

    wangwei19820517: 写得很好,大哥

  • Java泛型:<? extends XXXX> 中的? 和 extends 的理解和使用实例

    一只章鱼灰: 3、通配符?的extends绑定中,是因为上下文决定了point的类型是 ? extends Number 的类型

  • IntelliJ IDEA使用教程 (总目录篇)

    weixin_46413690: 大佬,有idea2024版激活密钥吗

  • Java泛型:<? extends XXXX> 中的? 和 extends 的理解和使用实例

    qq_50839477: 博主真的太流弊了

  • HEXO安装(Win7 64 bit ),遇到cmd报错:'hexo' 不是内部或外部命令,也不是可运行的程序

    XudeID: 插眼, 再执行两条命令之后,并配bin的环境变量之后依旧不行,但是点击hexo.cmd文件后,可以查到版本。猜测是cmd文件会运行配置环境

最新文章

  • spring mvc No ServletContext set
  • Java UnsatisfiedLinkError问题
  • idea com.intellij.junit4.JUnit4TestRunnerUtil$5 overrides final method getRunner.()Lorg/junit/runner
2023年2篇
2022年17篇
2021年42篇
2020年74篇
2019年63篇
2018年47篇
2017年116篇
2016年226篇
2015年30篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为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 网站制作 网站优化