当前位置: 首页 > news >正文

高性能网站建设进阶...国家建设部标准官方网站

高性能网站建设进阶...,国家建设部标准官方网站,百度上推广一个网站该怎么做,Iis 建网站为什么说没有该用户内存溢出#xff08;OutofMemoryError#xff09; 简述 java doc 中对 Out Of Memory Error 的解释是#xff0c;没有空闲内存#xff0c;并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理#xff0c;由于 GCOutofMemoryError 简述 java doc 中对 Out Of Memory Error 的解释是没有空闲内存并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理由于 GC垃圾回收一直在发展所有一般情况下除非应用程序占用的内存增长速度非常快造成垃圾回收已经跟不上内存消耗的速度否则不太容易出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现所以掌握 Java 内存模型原理和学会分析出现的内存溢出或内存泄漏仍然十分重要。 大多数情况下GC 会进行各种年龄段的垃圾回收实在不行了就放大招来一次独占式的 Full GC 操作这时候会回收大量的内存供应用程序继续使用。 在抛出 OutofMemoryError 之前通常垃圾收集器会被触发尽其所能去清理出空间。例如在引用机制分析中涉及到 JVM 会去尝试回收软引用指向的对象等。在 java.nio.BIts.reserveMemory() 方法中System.gc() 会被调用以清理空间。 当然也不是在任何情况下垃圾收集器都会被触发的。比如分配了一个超大对象类似一个超大数组超过堆的最大值JVM 可以判断出垃圾收集并不能解决这个问题所以直接抛出 OutofMemoryError。 内存溢出的常见情形 不同的内存溢出错误可能会发生在内存模型的不同区域因此需要根据出现错误的代码具体分析来找出可能导致错误发生的地方并想办法进行解决。 栈内存溢出StackOverflowError 栈内存可以分为虚拟机栈VM Stack和本地方法栈Native Method Stack除了它们分别用于执行 Java 方法字节码和本地方法其余部分原理是类似的。 以虚拟机栈为例说明Java 虚拟机栈是线程私有的当线程中方法被调度时虚拟机会创建用于保存局部变量表、操作数栈、动态连接和方法出口等信息的栈帧Stack Frame。 具体来说当线程执行某个方法时JVM 会创建栈帧并压栈此时刚压栈的栈帧就成为了当前栈帧。如果该方法进行递归调用时JVM 每次都会将保存了当前方法数据的栈帧压栈每次栈帧中的数据都是对当前方法数据的一份拷贝。如果递归的次数足够多多到栈中栈帧所使用的内存超出了栈内存的最大容量此时 JVM 就会抛出 StackOverflowError。 总之不论是因为栈帧太大还是栈内存太小当新的栈帧内存无法被分配时JVM 就会抛出 StackOverFlowError。 优化方案 可以通过设置 JVM 启动参数 -Xss 参数来改变栈内存大小。 注分配给栈的内存并不是越大越好因为栈内存越大线程多留给堆的空间就不多了容易抛出OOM。JVM的默认参数一般情况没有问题包括递归。 递归调用要控制好递归的层级不要太高超过栈的深度。 递归调用要防止形成死循环否则就会出现栈内存溢出。 堆内存溢出OutOfMemoryErrorjava heap space 堆内存的唯一作用就是存放数组和对象实例即通过 new 指令创建的对象包括数组和引用类型。 堆内存溢出又分为两种情况 Java 虚拟机的堆内存设置不够 如果堆的大小不合理没有显式指定 JVM 堆大小或者指定数值偏小对象所需内存太大创建对象时分配空间JVM 就会抛出 OutOfMemoryErrorjava heap space 异常。 优化方案 如果要处理比较可观的数据量可以通过修改 JVM 启动参数 -Xms 、-Xmx 来调整。使用压力测试来调整这两个参数达到最优值。 尽量避免大的对象的申请例如文件上传大批量从数据库中获取等。 尽量分块或者分批处理有助于系统的正常稳定的执行。 尽量提高一次请求的执行速度垃圾回收越早越好。 否则大量的并发来了的时候再来新的请求就无法分配内存了就容易造成系统的雪崩。 堆内存泄露最终导致堆内存溢出 当堆中一些对象不再被引用但垃圾回收器无法识别时这些未使用的对象就会在堆内存空间中无限期存在不断的堆积就会造成内存泄漏。不停的堆积最终会触发 java . lang.OutOfMemoryError。 优化方案如果发生了内存泄漏则可以先找出导致泄漏发生的对象是如何被 GC ROOT 引用起来的然后通过分析引用链找到发生泄漏的地方进行代码优化。 永久代溢出OutOfMemoryErrorPermGen sapce 对于老版本的 oracle JDK因为永久代的大小是有限的并且 JVM 对永久代垃圾回收例如常量池回收、卸载不再需要的类型非常不积极所以当不断添加新类型的时候永久代出现 OutOfMemoryError 也非常多见尤其是在运行时存在大量动态类型生成的场合类似 intern 字符串缓存占用太多空间也会导致 OOM 问题对应的异常信息会标记出来和永久代相关“java.lang.OutOfMemoryError:PermGen space。 随着元数据区的引入方法区内存已经不再那么窘迫所以相应的 OOM 有所改观出现 OOM异常信息则变成了“java.lang.OutofMemoryError:Metaspace。 元空间内存溢出OutOfMemoryError: Metaspace 元空间的溢出系统会抛出 java.lang.OutOfMemoryError: Metaspace 出现这个异常的问题的原因是系统的代码非常多或引用的第三方包非常多或者通过动态代码生成类加载等方法导致元空间的内存占用很大。 优化方案 默认情况下元空间的大小仅受本地内存限制。 但是为了整机的性能尽量还是要对该项进行设置优化参数配置以免造成整机的服务停机。 慎重引用第三方包 对第三方包一定要慎重选择不需要的包就去掉。 这样既有助于提高编译打包的速度也有助于提高远程部署的速度。 关注动态生成类的框架 对于使用大量动态生成类的框架要做好压力测试验证动态生成的类是否超出内存的需求会抛出异常。 直接内存溢出 如果直接或间接很多 java NIO例如在 netty 的框架中被封装为其他的方法使用了 ByteBuffer 中的 allocateDirect() 方法而又不做 clear 的时候就会抛出 java.lang.OutOfMemoryError: Direct buffer memory 异常。 如果经常有类似的操作可以考虑设置 JVM 参数-XX:MaxDirectMemorySize并及时 clear 内存。 创建本地线程内存溢出 除了堆以外的区域无法为线程分配一块内存区域了线程基本只占用堆以外的内存区域要么是内存本身就不够要么堆的空间设置得太大了导致了剩余的内存已经不多了而由于线程本身要占用内存所以就不够用了。 优化方案 首先检查操作系统是否有线程数的限制如果使用 shell 也无法创建线程就需要调整系统的最大可支持的文件数。日常开发中尽量保证线程最大数的可控制的不要随意使用可以无限制增长的线程池。 数组超限内存溢出 JVM 在为数组分配内存之前会执行特定平台的检查分配的数据结构是否在此平台是可寻址的。 一般来说 java 对应用程序所能分配数组最大大小是有限制的只不过不同的平台限制有所不同但通常在1到21亿个元素之间。当应用程序试图分配大于 Java 虚拟机可以支持的数组时会报 Requested array size exceeds VM limit 错误。 不过这个错误一般少见的主要是由于 Java 数组的索引是 int 类型。 Java 中的最大正整数为 2 ^ 31 - 1 2,147,483,647。 并且平台特定的限制可以非常接近这个数字例如Jdk1.8 可以初始化数组的长度高达 2,147,483,645Integer.MAX_VALUE-2。若是在将数组的长度再增加 1 达到 nteger.MAX_VALUE-1 就会出现 OutOfMemoryError 了。 优化方案数组长度要在平台允许的长度范围之内。 超出交换区内存溢出 在 Java 应用程序启动过程中可以通过 -Xmx 和其他类似的启动参数限制指定的所需的内存。而当 JVM 所请求的总内存大于可用物理内存的情况下操作系统开始将内容从内存转换为硬盘。 当应用程序向 JVM native heap 请求分配内存失败并且 native heap 也即将耗尽时 JVM 会抛出Out of swap space 错误 错误消息中包含分配失败的大小以字节为单位和请求失败的原因。 优化方案 增加系统交换区的大小。 但如果使用了交换区性能会大大降低不建议采用这种方式。 生产环境尽量避免最大内存超过系统的物理内存。其次去掉系统交换区只使用系统的内存保证应用的性能。 系统杀死进程内存溢出 操作系统是建立在进程的概念之上这些进程在内核中作业其中有一个非常特殊的进程称为“内存杀手Out of memory killer”。当内核检测到系统内存不足时OOM killer 被激活检查当前谁占用内存最多然后将该进程杀掉。 一般 Out of memory:Kill process or sacrifice child 报错会在当可用虚拟内存包括交换空间消耗到让整个操作系统面临风险内存不足时会被触发。在这种情况下OOM Killer 会选择“流氓进程”并杀死它。 优化方案 增加交换空间的方式可以缓解 Java heap space 异常但还是建议最好的方案就是升级系统内存让 java 应用有足够的内存可用就不会出现这种问题。 内存泄漏memory leak 简述 也称作“存储渗漏”。 严格来说只有对象不会再被程序用到了但是 GC 又不能回收它们的情况才叫内存泄漏。 但实际情况很多时候一些不太好的实践或疏忽会导致对象的生命周期变得很长甚至导致 OOM也可以叫做宽泛意义上的“内存泄漏”。 尽管内存泄漏并不会立刻引起程序崩溃但是一旦发生内存泄漏程序中的可用内存就会被逐步蚕食直至耗尽所有内存最终出现 OutOfMemory 异常导致程序崩溃。 注意这里的可用内存并不是指物理内存而是指虚拟内存大小这个虚拟内存大小取决于磁盘交换区设定的大小。 Java 使用可达性分析算法最上面的数据不可达就是需要被回收的。 后期有一些对象不用了按道理应该断开引用但是存在一些链没有断开从而导致没有办法被回收 可达性分析算法 可达性分析算法判断对象是否是不再使用的对象本质都是判断一个对象是否还被引用。那么对于这种情况下由于代码的实现不同就会出现很多种内存泄漏问题让 JVM 误以为此对象还在引用中无法回收造成内存泄漏。 举例说明 对象 X 引用对象 YX 的生命周期比 Y 的生命周期长那么当 Y 生命周期结束的时候X 依然引用着 Y这时候垃圾回收期是不会回收对象 Y 的如果对象 X 还引用着生命周期比较短的 A、B、C对象 A 又引用着对象 a、b、c这样就可能造成大量无用的对象不能被回收进而占据了内存资源造成内存泄漏直到内存溢出。 Java 中内存泄漏的 8 种情况 静态集合类如 HashMap、LinkedList 等等。 如果这些容器为静态的那么它们的生命周期与 JVM 程序一致则容器中的对象在程序结束之前将不能被释放从而造成内存泄漏。 简而言之长生命周期的对象持有短生命周期对象的引用尽管短生命周期的对象不再使用但是因为长生命周期对象持有它的引用而导致不能被回收。 单例模式 单例模式和静态集合导致内存泄露的原因类似因为单例的静态特性它的生命周期和 JVM 的生命周期一样长所以如果单例对象如果持有外部对象的引用那么这个外部对象也不会被回收那么就会造成内存泄漏。 内部类持有外部类的引用 在 Java 中内部类的定义与使用一般为成员内部类与匿名内部类他们的对象都会隐式持有外部类对象的引用影响外部类对象的回收。 可以通过反编译可以来验证这个理论 java 代码 public class Outer {private String name;class Inner{private String test;} }反编译后的代码 class Outer$Inner {private String test;final Outer this$0;Outer$Inner() {this.this$0 Outer.this;super();} }可以清楚的发现内部类的属性中有这个外部类并且在内部类的构造函数中有这个外部类属性的初始化。 如果一个外部类的实例对象的方法返回了一个内部类的实例对象而这个内部类对象被长期引用了那么即使那个外部类实例对象不再被使用但由于内部类持有外部类的实例对象引用这个外部类对象将不会被垃圾回收这也会造成内存泄漏。 各种连接如数据库连接、网络连接和 IO 连接等 在对数据库进行操作的过程中首先需要建立与数据库的连接当不再使用时需要调用 close 方法来释放与数据库的连接。只有连接被关闭后垃圾回收器才会回收对应的对象。 否则如果在访问数据库的过程中**对 Connection、Statement 或 ResultSet 不显性地关闭将会造成大量的对象无法被回收**从而引起内存泄漏。 变量不合理的作用域 一般而言一个变量的定义的作用范围大于其使用范围很有可能会造成内存泄漏。另一方面如果没有及时地把对象设置为 null很有可能导致内存泄漏的发生。 class Outer$Inner {private String test;final Outer this$0;Outer$Inner() {this.this$0 Outer.this;super();} }如上面这个伪代码通过 readFromNet 方法把接受的消息保存在变量 msg 中然后调用 saveDB 方法把 msg 的内容保存到数据库中此时 msg 已经就没用了由于 msg 的生命周期与对象的生命周期相同此时 msg 还不能回收因此造成了内存泄漏。 优化方案 方案1这个 msg 变量可以放在方法内部当方法使用完那么 msg 的生命周期也就结束就可以回收了。方案2在使用完 msg 后把 msg 设置为 null这样垃圾回收器也会回收 msg 的内存空间。 改变哈希值 当一个对象被存储进 HashSet 集合中以后就不能修改这个对象中的那些参与计算哈希值的字段了。 否则对象修改后的哈希值与最初存储进 HashSet 集合中时的哈希值就不同了在这种情况下即使在 contains 方法使用该对象的当前引用作为的参数去 HashSet 集合中检索对象也将返回找不到对象的结果这也会导致无法从 HashSet 集合中单独删除当前对象造成内存泄漏。 这也是 String 为什么被设置成了不可变类型可以放心地把 String 存入 HashSet或者把 String 当做 HashMap 的 key 值 当想把自己定义的类保存到散列表的时候需要保证对象的 hashCode 不可变。 /*** 演示内存泄漏*/ public class ChangeHashCode1 {public static void main(String[] args) {HashSet hs new HashSet();Point cc new Point();cc.setX(10);//hashCode 41hs.add(cc);cc.setX(20);//hashCode 51System.out.println(hs.remove hs.remove(cc));//falsehs.add(cc);System.out.println(hs.size hs.size());//size 2} }class Point {int x;public int getX() return x;public void setX(int x) this.x x;Overridepublic int hashCode() {final int prime 31;int result 1;result prime * result x;return result;}Overridepublic boolean equals(Object obj) {if (this obj) return true;if (obj null) return false;if (getClass() ! obj.getClass()) return false;Point other (Point) obj;if (x ! other.x) return false;return true;} }对象缓存泄漏 一旦把对象引用放入到缓存中就很容易遗忘。 比如代码中会加载一个表中的数据到缓存内存中测试环境只有几百条数据但是生产环境则可能会有几百万的数据。 优化方案可以使用 WeakHashMap 代表缓存此种 Map 的特点是当除了自身有对 key 的引用外此 key 没有其他引用那么此 map 会自动丢弃此值。 /*** 演示内存泄漏*/ public class MapTest {static Map wMap new WeakHashMap();static Map map new HashMap();public static void main(String[] args) {init();testWeakHashMap();testHashMap();}public static void init() {String ref1 new String(obejct1);String ref2 new String(obejct2);String ref3 new String(obejct3);String ref4 new String(obejct4);wMap.put(ref1, cacheObject1);wMap.put(ref2, cacheObject2);map.put(ref3, cacheObject3);map.put(ref4, cacheObject4);System.out.println(String引用ref1ref2ref3ref4 消失);}public static void testWeakHashMap() {System.out.println(WeakHashMap GC之前);for (Object o : wMap.entrySet()) {System.out.println(o);}try {System.gc();TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(WeakHashMap GC之后);for (Object o : wMap.entrySet()) {System.out.println(o);}}public static void testHashMap() {System.out.println(HashMap GC之前);for (Object o : map.entrySet()) {System.out.println(o);}try {System.gc();TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(HashMap GC之后);for (Object o : map.entrySet()) {System.out.println(o);}}} /*** 结果* String引用ref1ref2ref3ref4 消失* WeakHashMap GC之前* obejct2cacheObject2* obejct1cacheObject1* WeakHashMap GC之后* HashMap GC之前* obejct4cacheObject4* obejct3cacheObject3* Disconnected from the target VM, address: 127.0.0.1:51628, transport: socket* HashMap GC之后* obejct4cacheObject4* obejct3cacheObject3**/上面代码演示 WeakHashMap 如何自动释放缓存对象当 init 函数执行完成后局部变量字符串引用 weakd1weakd2d1d2 都会消失此时只有静态 map 中保存中对字符串对象的引用可以看到调用 gc 之后HashMap 的没有被回收而 WeakHashMap 里面的缓存被回收了。 监听器和回调 内存泄漏另一个常见来源是监听器和其他回调如果客户端在实现的 API 中注册回调却没有显式的取消那么就会积聚。 需要确保回调立即被当作垃圾回收的最佳方法是只保存它的弱引用例如将它们保存成为 WeakHashMap 中的键。
文章转载自:
http://www.morning.lylkh.cn.gov.cn.lylkh.cn
http://www.morning.hlxpz.cn.gov.cn.hlxpz.cn
http://www.morning.wpsfc.cn.gov.cn.wpsfc.cn
http://www.morning.wwjft.cn.gov.cn.wwjft.cn
http://www.morning.flhnd.cn.gov.cn.flhnd.cn
http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.morning.kskpx.cn.gov.cn.kskpx.cn
http://www.morning.nllst.cn.gov.cn.nllst.cn
http://www.morning.nafdmx.cn.gov.cn.nafdmx.cn
http://www.morning.qrqcr.cn.gov.cn.qrqcr.cn
http://www.morning.wbfly.cn.gov.cn.wbfly.cn
http://www.morning.wklhn.cn.gov.cn.wklhn.cn
http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn
http://www.morning.lokext.com.gov.cn.lokext.com
http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn
http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn
http://www.morning.bfysg.cn.gov.cn.bfysg.cn
http://www.morning.lgwpm.cn.gov.cn.lgwpm.cn
http://www.morning.wsyq.cn.gov.cn.wsyq.cn
http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn
http://www.morning.rhsg.cn.gov.cn.rhsg.cn
http://www.morning.hnzrl.cn.gov.cn.hnzrl.cn
http://www.morning.xtxp.cn.gov.cn.xtxp.cn
http://www.morning.skdhm.cn.gov.cn.skdhm.cn
http://www.morning.rmfw.cn.gov.cn.rmfw.cn
http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn
http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn
http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn
http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn
http://www.morning.bylzr.cn.gov.cn.bylzr.cn
http://www.morning.kxltf.cn.gov.cn.kxltf.cn
http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn
http://www.morning.hpdpp.cn.gov.cn.hpdpp.cn
http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn
http://www.morning.brbnc.cn.gov.cn.brbnc.cn
http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn
http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn
http://www.morning.mytmx.cn.gov.cn.mytmx.cn
http://www.morning.btrfm.cn.gov.cn.btrfm.cn
http://www.morning.srkzd.cn.gov.cn.srkzd.cn
http://www.morning.fmznd.cn.gov.cn.fmznd.cn
http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn
http://www.morning.cltrx.cn.gov.cn.cltrx.cn
http://www.morning.ykgkh.cn.gov.cn.ykgkh.cn
http://www.morning.grnhb.cn.gov.cn.grnhb.cn
http://www.morning.klzdy.cn.gov.cn.klzdy.cn
http://www.morning.hrydl.cn.gov.cn.hrydl.cn
http://www.morning.nmlpp.cn.gov.cn.nmlpp.cn
http://www.morning.gtmgl.cn.gov.cn.gtmgl.cn
http://www.morning.fjscr.cn.gov.cn.fjscr.cn
http://www.morning.rsjng.cn.gov.cn.rsjng.cn
http://www.morning.ahlart.com.gov.cn.ahlart.com
http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn
http://www.morning.zxznh.cn.gov.cn.zxznh.cn
http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn
http://www.morning.tkchg.cn.gov.cn.tkchg.cn
http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn
http://www.morning.rgsgk.cn.gov.cn.rgsgk.cn
http://www.morning.kybyf.cn.gov.cn.kybyf.cn
http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com
http://www.morning.prznc.cn.gov.cn.prznc.cn
http://www.morning.drrt.cn.gov.cn.drrt.cn
http://www.morning.srgnd.cn.gov.cn.srgnd.cn
http://www.morning.cprls.cn.gov.cn.cprls.cn
http://www.morning.knwry.cn.gov.cn.knwry.cn
http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn
http://www.morning.qypjk.cn.gov.cn.qypjk.cn
http://www.morning.yfmxn.cn.gov.cn.yfmxn.cn
http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn
http://www.morning.nqxdg.cn.gov.cn.nqxdg.cn
http://www.morning.xsklp.cn.gov.cn.xsklp.cn
http://www.morning.ytfr.cn.gov.cn.ytfr.cn
http://www.morning.mxptg.cn.gov.cn.mxptg.cn
http://www.morning.lzsxp.cn.gov.cn.lzsxp.cn
http://www.morning.cknsx.cn.gov.cn.cknsx.cn
http://www.morning.rwzc.cn.gov.cn.rwzc.cn
http://www.morning.blqgc.cn.gov.cn.blqgc.cn
http://www.morning.ymrq.cn.gov.cn.ymrq.cn
http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn
http://www.tj-hxxt.cn/news/255722.html

相关文章:

  • 镇江市建设工程质量监督局网站如何编写一个软件
  • 模板建网站多少钱南宁区建设银行招聘网站
  • 网页制作免费的素材网站免费的网页模版
  • 微网站开发需求承接各类网站建设
  • 福州网站建设哪家公司好哪些公司的网站做的漂亮
  • 手机版景区网站龙华企业网站建设
  • 企业网站做优化客户网站开发全流程图
  • 重庆seo整站优化服务手机购物网站模板下载
  • 网站推广线上推广大城网站优化
  • 吕梁做网站公司广州番禺区严格控制人员流动
  • 打开部分网站很慢重庆乐尚装饰工程有限公司
  • 文化网站建设论文电信网站开发语言主要用什么
  • 找哪里做网站怎么原创视频网站
  • 黄浦做网站有哪些公司
  • 建设银行网站登录不了罗定建设局网站
  • 营销型单页面网站成都公关公司排名
  • 专业做网站关键词排名下掉青州住房建设局网站
  • 做动画 的 网站腾讯广告投放端提供的建站工具有
  • 西安网站开发个人主页界面网站
  • 跨境电子商务网页制作与网站建设设计开发建设网站平台
  • 聊城市公司网站建站东莞网站建设网络公司排名
  • logo做ppt模板下载网站微信公众账号登录入口
  • 网站上传不了图片不显示不出来吗柳州住房和城乡建设厅网站
  • 深圳响应式设计企业网站百度推广培训班
  • 怎么查看网站开发使用什么技术wordpress搭建教程
  • 网站怎么做微信支付宝支付百度seo怎么收费
  • 淘宝店购买网站国精产品w灬源码1688说明
  • 搜索网站怎么做的建筑设计案例网站
  • 以前自己做的网站怎么样删除.net做网站用什么框架
  • 有做兼职赚钱的网站吗做网站开发甲方一直要求p图