第27章:OOM常见各种场景及解决方案

23 篇文章 2 订阅
订阅专栏

1、OOM案例1:堆溢出

1.1、报错信息

java.lang.OutOfMemoryError: Java heap space

1.2、案例模拟

127.0.0.1:8080/add

/**
 * 案例1:模拟线上环境OOM
 */
@RequestMapping("/add")
public void addObject(){
    System.err.println("add"+peopleSevice);
    ArrayList<People> people = new ArrayList<>();
    while (true){
        people.add(new People());
    }
}

1.3、JVM参数配置

-XX:+PrintGCDetails -XX:MetaspaceSize=64m -XX:+PrintGCDateStamps 
-XX:+HeapDumpOnOutMemoryError -XX:HeapDumpPath=/usr/local/heapdump.hprof
-Xmx80M -Xmx80M -Xloggc:log/gc-oomHeap.log

1.4、运行结果

1.5、原因及解决方案

原因

1、代码中可能存在大对象分配

2、可能存在内存泄漏,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象

解决方法

1、检查是否存在大对象的分配,最有可能的是大数组分配

2、通过jmap命令,把堆内存dump下来,使用AT等工具分析一下,检查是否存在内存泄漏的问题

3、如果没有找到明显的内存泄漏,使用 -Xmx 加大堆内存

4、还有一点容易被忽略,检查是否有大量的自定义的 Finalizable对象,也有可能是框架内部提供的,考虑其存在的必要性

1.6、dump文件分析

dump文件编号 20210801

 

 

 

 

1.7、gc日志分析

2、OOM案例2:元空间溢出

2.1、元空间数据类型

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-heap(非堆),目的应该是与Java堆区分开来。

Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。垃圾收集行为在这个区域是比较少出现的,其内存回收目标主要是针对常量池的回收和对类型的卸载。当方法区无法满足内存分配需求时,将抛出 OutOfMemory Error异常。

2.2、报错信息

java.lang.OutOfMemoryError: Metaspace

2.3、案例模拟

127.0.0.1:8080/metaSpaceOom

/**
     * 案例2:模拟元空间OOM溢出
     */
    @RequestMapping("/metaSpaceOom")
    public void metaSpaceOom(){
        ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
        while (true){
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(People.class);
            enhancer.setUseCache(false);
//            enhancer.setUseCache(true);
            enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
                System.out.println("我是加强类,输出print之前的加强方法");
                return methodProxy.invokeSuper(o,objects);
            });
            People people = (People)enhancer.create();
            people.print();
            System.out.println(people.getClass());
            System.out.println("totalClass:" + classLoadingMXBean.getTotalLoadedClassCount());
            System.out.println("activeClass:" + classLoadingMXBean.getLoadedClassCount());
            System.out.println("unloadedClass:" + classLoadingMXBean.getUnloadedClassCount());
        }
    }

 

2.4、JVM参数设置

-XX:+PrintGCDetails
-XX:MetaspaceSize=60m
-XX:MaxMetaspaceSize=60m
-Xss512K
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heap/heapdumpMeta.hprof
-XX:+TraceClassUnloading
-Xmx60M
-Xmx60M
-Xloggc:log/gc-oomMeta.log

2.5、原因及解决方案

JDK8后,元空间替换了永久代,元空间使用的是本地内存

原因:

1.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载

2.应用长时间运行,没有重启

3.元空间内存设置过小

解决方法:

因为该OOM原因比较简单,解决方法有如下几种:

1.检查是否永久代空间或者元空间设置的过小

2.检查代码中是否存在大量的反射操作

3.dump之后通过mat检查是否存在大量由于反射生成的代理类

2.6、分析及解决

2.6.1、查看监控

2.6.2、查看GC状态

 

2.6.3、查看GC日志

2.6.4、分析dump文件

dump文件编号 20210802

 

jvisualvm分析

 

 

MAT分析

 

2.6.5、解决方案

公用加载类

enhancer.setUseCache(true);

3、OOM案例3:GC overhead limit exceeded

3.1、案例模拟

3.1.1、示例代码1

JVM配置

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heap/dumpExceeded.hprof
-Xmx10M
-Xmx10M
-Xloggc:log/gc-oomExceeded.log

 

/**
 * 案例3:测试 GC overhead limit exceeded
 * @author shkstart
 * @create 16:57
 */
public class OOMTest {
    public static void main(String[] args) {
        test1();

//        test2();
    }

    public static void test1() {
        int i = 0;
        List<String> list = new ArrayList<>();
        try {
            while (true) {
                list.add(UUID.randomUUID().toString().intern());
                i++;
            }
        } catch (Throwable e) {
            System.out.println("************i: " + i);
            e.printStackTrace();
            throw e;
        }
    }



}

3.1.2、示例代码2

JVM配置

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heap/dumpHeap1.hprof
-Xmx10M
-Xmx10M
-Xloggc:log/gc-oomHeap1.log
  public static void test2() {
        String str = "";
        Integer i = 1;
        try {
            while (true) {
                i++;
                str += UUID.randomUUID();
            }
        } catch (Throwable e) {
            System.out.println("************i: " + i);
            e.printStackTrace();
            throw e;
        }
    }

3.2、代码解析

第一段代码:运行期间将内容放入常量池的典型案例

intern()方法

  • 如果字符串常量池里面已经包含了等于字符串X的字符串,那么就返回常量池中这个字符串的引用;
  • 如果常量池中不存在,那么就会把当前字符串添加到常量池并返回这个字符串的引用

第二段代码:不停的追加字符串str

你可能会疑惑,看似demo也没有差太多为什么第二个没有报 GC overhead limit exceeded呢?以上两个demo的区别在于:

  • Java heap space的demo每次都能回收大部分的对象(中间产生的UUID),只不过有一个对象是无法回收的,慢慢长大,直到内存溢出
  • GC overhead limit exceeded的demo由于每个字符串都在被list引用,所以无法回收,很快就用完内存,触发不断回收的机制。

报错信息:

2021-11-21T03:09:20.177-0800: 5.710: [Full GC (Ergonomics) [PSYoungGen: 2048K->2048K(2560K)] [ParOldGen: 7065K->7063K(7168K)] 9113K->9111K(9728K), [Metaspace: 3582K->3582K(1056768K)], 0.0176855 secs] [Times: user=0.11 sys=0.00, real=0.02 secs] 
2021-11-21T03:09:20.196-0800: 5.729: [Full GC (Ergonomics) [PSYoungGen: 2048K->2048K(2560K)] [ParOldGen: 7086K->7086K(7168K)] 9134K->9134K(9728K), [Metaspace: 3582K->3582K(1056768K)], 0.0182876 secs] [Times: user=0.12 sys=0.00, real=0.02 secs] 
2021-11-21T03:09:20.257-0800: 5.790: [Full GC (Ergonomics) [PSYoungGen: 2048K->0K(2560K)] [ParOldGen: 7108K->706K(5632K)] 9156K->706K(8192K), [Metaspace: 3582K->3582K(1056768K)], 0.0053749 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

通过查看GC日志可以发现,系统在频繁性的做 FULL GC,但是却没有回收掉多少空间,那么引起的原因可能是因为内存不足,也可能是存在内存泄漏的情况,接下来我们要根据堆dump文件来具体分析。

3.3、分析及解决

dump文件编号 20210803

第1步:定位问题代码块

 

 

第2步:分析dump文件直方图

 

 

 

第3步:代码修改

根据业务来修改是否需要死循环。

原因:

这个是JDK6新加的错误类型,一般都是堆太小导致的。Sun官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。本质是一个预判性的异常,抛出该异常时系统没有真正的内存溢出

解决方法:

1.检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。

2.添加参数 -XX:-UseGCoverheadLimit 禁用这个检查,其实这个参数解决不了内存问题,只是把错误的信息延后,最终出现java.lang.OutOfMemoryError: Java heap space。

3.dump内存,检查是否存在内存泄漏,如果没有,加大内存。

4、OOM案例4:线程溢出

4.1、报错信息

Java.lang.OutOfMemeoryError:unable to create new native thread

4.2、问题原因

出现这种情况,基本上都是创建了大量的线程导致的

4.3、案例模拟

/**
 * 测试4:线程溢出
 * @author shkstart
 * @create 17:45
 */
public class TestNativeOutOfMemoryError {
    public static void main(String[] args) {
        for (int i = 0; ; i++) {
            System.out.println("i = " + i);
            new Thread(new HoldThread()).start();
        }
    }
}

class HoldThread extends Thread {
    CountDownLatch cdl = new CountDownLatch(1);

    @Override
    public void run() {
        try {
            cdl.await();
        } catch (InterruptedException e) {
        }
    }
}

 

4.4、分析及解决

解决方向1:

  • 通过 -Xss 设置每个线程栈大小的容量
  • JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K
  • 正常情况下,在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
  • 能创建的线程数的具体计算公式如下:

(MaxprocessMemory- JVMMemory- ReservedOsMemory)/(ThreadStackSize)=Number of threads

MaxprocessMemory 指的是进程可寻址的最大空间

JVMMemory JVM内存

ReservedOsMemory 保留的操作系统内存

ThreadStackSize 线程栈的大小

  • 在Java语言里,当你创建一个线程的时候,虚拟机会在JVM内存创建一个 Thread 对象同时创建一个操作系统线程,而这个系统线程的内存用的不是 JVMMemory,而是系统中剩下的内存
  • 由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生 Java.lang.OutOfMemeoryError:unable to create new native thread

问题解决:

1、如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。

2、如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改 MaxprocessMemory, JVMMemory, ThreadStackSize这三个因素,来增加能创建的线程数。

3、 MaxprocessMemory 使用64位操作系统

4、 JVMMemory 减少 JVMMemory的分配

5、 ThreadStackSize减小单个线程的栈小

经实测,在32位 windows系统下较为严格遵守;64位系统下只能保证正/负相关性,甚至说相关性也不能保证。即:

在测试的过程中,64位操作系统下调整Xss的大小并没有对产生线程的总数产生影响,程序执行到极限的时候,操作系统会死机。无法看出效果

在32位win7操作系统下测试,jdk版本1.8(适配32位操作系统)会发现调整Xss的大小会对线程数量有影响,如下表所示:

省略表

由上可见,64位操作系统对于实验的结果是不明显的,但是32位操作系统对于Xss的设置对于实验结果是明显的,为什么会产生这样的结果?我们上面讲到过线程数量的计算公式

(MaxprocessMemory- JVMMemory- ReservedOsMemory)/(ThreadStackSize)=Number of threads

其中 MaxprocessMemory 表示最大寻址空间,在32位系统中,CPU的“寻址范围”就受到32个二进制位的限制,也就是说,假设它要访问内存,它的能力是,只能访问4G内存。

32位二进制数最大值是11111111111111111112的32次方4294967296=4194304k(1k是1024)=4096M(1M是1048576)=4GB。也就是说32位CPU只能访问4GB的内存。再减去显卡上的显存等内存,可用内存要小于4G,所以32位操作系统可用线程数量是有限的。

64位二进制数的最大值是1111111111111111111111111111111111b,2的64次方=1719869184 GB,大家可以看看64位操作的寻址空间大小比32位操作系统多了太多,所以这也是为什么我们总是无法测试出很好效果的原因。

综上,在生产环境下如果需要更多的线程数量,建议使用64位操作系统,如果必须使用32位操作系统,

解决方向2:

线程总数也受到系统空闲内存和操作系统的限制,检查是否该系统下有此限制:

/proc/sys/kernel/pid_max 系统最大pid值,在大型系统里可适当调大

/proc/sys/kernel/threads-max 系统允许的最大线程数

maxuserprocess(ulimit--u) 系统限制某用户下最多可以运行多少进程或线程

/proc/sys/vm/max_map_count

max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在 NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。

万字精研:大型语言模型微调Fine-Tuning技术——14种主流方法的原理、适用场景及实践指南
丨汀、的博客
09-05 343
万字精研:大型语言模型微调Fine-Tuning技术——14种主流方法的原理、适用场景及实践指南
Linux系统交换(swap)机制实现原理以及OOM测试
tugouxp的专栏
07-20 2165
综上,可以swap出去的页面包含匿名页和共享页,除此之外,不支持swap到磁盘交换分区或者swap文件。所以可以看出,对于内存回收来说,文件cache的回收和匿名页面的回收是同一个路径,没有区别,只有到具体的承载后台时候,这也是为何开始一致寻找swap处理的“特殊路径”求而不得的原因,原因就是这个特殊路径不存在,swap处理也没有什么特殊的,"特殊"的部分仅仅是swap_aops的实现,这部分一开始我就找到了。匿名页面是如何来的?
什么是 java OOM举例说明哪些场景会出现OOM?如何分析及解决 OOM 问题?
weixin_42956047的博客
12-09 3190
1. 什么是OOMOOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。 看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory...
JVM状态监控与OOM案例分析
11-30
JVM状态监控与OOM案例分析…… 简单认识,了解
什么是 Heap dump?Java 如何生成 Heap dump?
最新发布
2301_78976656的博客
08-13 330
本文,我们分析了什么是 Heap dump,Heap dump包含的信息以及 5种生成 Heap dump的方式,每种方式都有其适用场景和限制,选择合适的方法可以更有效地进行内存分析和故障排查。
Java OutOfMemoryError 汇总
Silver_sail的专栏
11-05 630
1、OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heap space 分  析 此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可,参数样例为:-Xmx2G 解决方法 调高heap的最大值,即-Xmx的值调大。2、OOM for Perm=>例如:java.lang.OutOfMemoryError: J
Java常见OOM场景及解决方法
iteye_9584的博客
06-20 799
OOM for Heap (java.lang.OutOfMemoryError: Java heap space) 分析 此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可,参数样例为:-Xmx2G JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是...
常见OOM 问题的 6 种场景
qq_37741426的博客
03-23 1131
常见OOM 问题的 6 种场景
JVM性能调优(九):OOM案例
mingyuli的博客
11-14 1111
`
做了6年的Java,一文了解OOM解决方案,附面试题答案
m0_57285455的博客
05-18 386
前言 提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系。为此我撰写了这篇文,试图让这些底层架构相关知识更加直观易懂: 尽量以图文的方式描述技术原理; 涉及到关键的技术,附加官网或者技术书籍来源,方便大家进一步扩展学习; 涉及到的背景知识尽可能做一个交代,比如讨论到log buffer的刷盘方式,延伸一下IO写磁盘相关知识点。 好了,MySQL从不会到精通系列马上
Spark数据倾斜及解决方案
weixin_37789219的博客
10-09 4958
一,数据倾斜现象及原理 发生数据倾斜以后的现象: 1、你的大部分的task,都执行的特别特别快,刷刷刷,就执行完了(你要用client模式,standalone client,yarn client,本地机器只要一执行spark-submit脚本,就会开始打印log),task175 finished;剩下几个task,执行的特别特别慢,前面的task,一般1s可以执行完5个;最后发现1000个t...
深入了解iOS中的OOM(低内存崩溃)
热门推荐
TuGeLe的博客
01-16 2万+
在iOS开发过程或者用户反馈中,可能会经常看到这样的情况,用着用着就崩溃了,而在后台查看崩溃栈的时候,找不到崩溃日志。其实这大多数的可能是系统产生了低内存崩溃,也就是OOM(还有一种可能是主线程卡死,导致watchdog杀掉了应用),而低内存崩溃的日志,往往都是以JetsamEvent开头的,日志中有内存页大小(pageSize),CPU时间(cpuTime)等字段。 什么是OOM? 什么是OOM...
面试官:哪些场景会产生OOM?怎么解决?
艾小仙的专栏
09-17 2076
这个面试题是一个朋友在面试的时候碰到的,什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而且这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下来基本上4个场景可以概括下来。 堆内存溢出 堆内存溢出太常见,大部分人都应该能想得到这一点,堆内存用来存储对象实例,我们只要不停的创建对象,并且保证GC Roots和对象之间有可达路径避免垃圾回收,那么在对象数量超过最大堆的大小限制后很快就能出现这个异常。 写一段代码测试一下,设置堆内存大小2M。 publi
几种oom场景
@用小弟弟思考的程序员
03-03 240
版权归属http://sdh5724.iteye.com/   1. 非静态ThreaLocal使用, 及无回收点 2.  压缩流未使用end方法关闭(NATIVE MEM TEMP LEAK)3. 大量文件操作情况下, 不关闭文件流。4. JAVA实现大文件下载中, 未使用流模式。5. 未控制深度的递归调用。(OVER STACK)6. 可能导致大数据集的SQL语句。7. 使用CGLIB/A...
OOM问题小例子及思考
一直在奋起,一直在路上
04-03 699
前段时间朋友新进入一个公司,遇到线上系统cpu飙高,内存占满情况;和他交流过后有了本篇总结,该博文会以一个简单的小例子来演示oom,以及通过输出dump文件,最后用可视化工具进行分析定位具体oom的代码。
常见OOM现象
cyywxy的博客
07-25 2835
转自:https://www.cnblogs.com/kongzhongqijing/articles/7283599.html 《java 特种兵 上册》 3.6 常见OOM现象( 136-146页),看此节后的总结。 OOM的实际场景是很多的,这里介绍常见的,同时结合网络与实际测试中的一些资料信息。   一.HeapSize OOM(堆空间内存溢出) 关键字:java.lang.O...
Java中关于OOM场景及解决方法
ykblog.github.io
10-20 4008
Java中关于OOM场景及解决方法 1、OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heapspace 【分析】  此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可,参数样例为:-Xmx2G 【解决方法】 调高heap的最大值,即-Xmx的值调大。 2、OOM for Perm=>例如:jav
Bitmap全面解析
东方升起代码的博客
11-04 1242
Bitmap全面解析1. dp dip dpi px2. Bitmap 大小计算 看源码3. Bitmap 的内存开辟4. Bitmap 内存的回收4.1 recycle 方法4.2 不手动调用 recycle 方法时Native 层的 Bitmap 是怎么回收5.Bitmap 的内存复用6. xh,xxh,xxxh 放哪个文件夹更高效7.Bitmap 的内存优化与适配8.线上 OOM 的 dump 收集 1. dp dip dpi px dp = dip:Android 为了适配不同的设备弄出来
Java知识梳理——OOM出现的场景
Slayer_Zhao的博客
09-05 516
OOM for Heap (java.lang.OutOfMemoryError: Java heap space):heap的最大值不满足需要,将设置heap的最大值调高即可。OOM for StackOverflowError (Exception in thread "main" java.lang.StackOverflowError):如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛...
Java内存溢出:oom问题分析与解决方案
本文主要探讨了Java虚拟机(JVM)在遇到Out-of-MemoryError(OOM)和StackOverflowError时的常见原因及解决策略。 1. **堆内存溢出(Java Heap OOM)**: - 堆内存是JVMJava对象分配存储的主要区域,当分配给堆...
写文章

热门文章

  • skywalking安装部署 86785
  • Nginx简单部署前端页面 9169
  • Linux性能问题排查 7274
  • 第24章:JVM监控及诊断工具-GUI篇 6363
  • elasticsearch-analysis-ik-6.2.1的安装 4857

分类专栏

  • 电商数仓6.0 12篇
  • 数仓架构搭建 13篇
  • hive 6篇
  • 运维 20篇
  • 源码解读 5篇
  • jvm 23篇
  • 缓存 17篇
  • 性能 3篇
  • canal 2篇
  • 三界之外 1篇
  • k8s 2篇
  • 分布式链路追踪 3篇
  • Mycat 11篇
  • Elasticsearch 6篇
  • 基础算法 43篇
  • java基础 3篇
  • MySQL 11篇
  • Linux 16篇
  • SpringBoot 3篇
  • Docker 6篇
  • 多线程 15篇
  • MQ 3篇

最新评论

  • HBase

    普通网友: 这篇文章真是一篇佳作!作者运用了生动有趣的语言,将枯燥的理论知识娓娓道来,让人如沐春风。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Graylog Sidecar filebeat日志收集传输工具安装

    施小赞: 安装的版本是同一个吗??

  • 第27章:OOM常见各种场景及解决方案

    施小赞: 我搜了一下,写的是-XX:+HeapDumpOnOutOfMemoryError 啊

  • 第27章:OOM常见各种场景及解决方案

    wdywdywdywdy: 你这jvm参数里有个写错了,应该是 -XX:+HeapDumpOnOutOfMemoryError

  • Graylog Sidecar filebeat日志收集传输工具安装

    Mouse_qiao: 您好,我想问下,为啥我配置filebeat想收集日志却没有filebeat选项

大家在看

  • 2024年研赛-华为杯数模竞赛C题论文首发+论文讲解+代码分享
  • 【网站项目】SpringBoot486网上教学系统
  • 鸿蒙读书笔记2:《鸿蒙操作系统设计原理与架构》 1207
  • Linux 文件服务器-vsftp 配置本地(系统)用户看这一篇就OK 460
  • 带你0到1之QT编程:十五、探索QSplitter和QDockWidget的简单应用技巧 252

最新文章

  • HBase
  • 11、Hive+Spark数仓环境准备
  • 10、业务数据同步
2024年13篇
2023年19篇
2022年35篇
2021年38篇
2020年29篇
2019年4篇
2018年25篇
2015年28篇
2014年44篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

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