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

网站首页设计图wordpress鏁版嵁

网站首页设计图,wordpress鏁版嵁,广告公司寮步网站建设,如东做网站的公司【声明】 欢迎转载#xff0c;但请保留文章原始出处→_→ 生命壹号#xff1a;http://www.cnblogs.com/smyhvae/ 文章来源#xff1a;http://www.cnblogs.com/smyhvae/p/4736162.html 联系方式#xff1a;smyhvae163.com 本文主要内容#xff1a; Trace跟踪参数堆的… 【声明】  欢迎转载但请保留文章原始出处→_→  生命壹号http://www.cnblogs.com/smyhvae/ 文章来源http://www.cnblogs.com/smyhvae/p/4736162.html 联系方式smyhvae163.com   本文主要内容 Trace跟踪参数堆的分配参数栈的分配参数 零、在IDE的后台打印GC日志 既然学习JVM阅读GC日志是处理Java虚拟机内存问题的基础技能它只是一些人为确定的规则没有太多技术含量。 既然如此那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 1如果你用的是Eclipse打印GC日志的操作如下 在上图的箭头处加上-XX:PrintGCDetails这句话。于是运行程序后GC日志就可以打印出来了 2如果你用的是IntelliJ IDEA打印GC日志的操作如下 在上图的箭头处加上-XX:PrintGCDetails这句话。于是运行程序后GC日志就可以打印出来了 当然了光有-XX:PrintGCDetails这一句参数肯定是不够的下面我们详细介绍一下更多的参数配置。 一、Trace跟踪参数 1、打印GC的简要信息 -verbose:gc -XX:printGC 解释可以打印GC的简要信息。比如 [GC 4790K-374K(15872K), 0.0001606 secs] [GC 4790K-374K(15872K), 0.0001474 secs] [GC 4790K-374K(15872K), 0.0001563 secs] [GC 4790K-374K(15872K), 0.0001682 secs] 上方日志的意思是说GC之前用了4M左右的内存GC之后用了374K内存一共回收了将近4M。内存大小一共是16M左右。 2、打印GC的详细信息 -XX:PrintGCDetails 解释打印GC详细信息。 -XX:PrintGCTimeStamps 解释打印CG发生的时间戳。 理解GC日志的含义 例如下面这段日志 [GC[DefNew: 4416K-0K(4928K), 0.0001897 secs] 4790K-374K(15872K), 0.0002232 secs] [Times: user0.00 sys0.00, real0.00 secs]  上方日志的意思是说这是一个新生代的GC。方括号内部的“4416K-0K(4928K)”含义是“GC前该内存区域已使用容量-GC后该内存区域已使用容量该内存区域总容量”。而在方括号之外的“4790K-374K(15872K)”表示“GC前Java堆已使用容量-GC后Java堆已使用容量Java堆总容量”。 再往后看“0.0001897 secs”表示该内存区域GC所占用的时间单位是秒。 再比如下面这段GC日志 上图中我们先看一下用红框标注的“[0x27e80000, 0x28d80000, 0x28d80000)”的含义它表示新生代在内存当中的位置第一个参数是申请到的起始位置第二个参数是申请到的终点位置第三个参数表示最多能申请到的位置。上图中的例子表示新生代申请到了15M的控件而这个15M是等于eden space的12288Kfrom space的1536Kto space的1536K。 疑问分配到的新生代有15M但是可用的只有13824K为什么会有这个差异呢等我们在后面的文章中学习到了GC算法之后就明白了。 3、指定GC log的位置 -Xloggc:log/gc.log 解释指定GC log的位置以文件输出。帮助开发人员分析问题。 -XX:PrintHeapAtGC 解释每一次GC前和GC后都打印堆信息。 例如 上图中红框部分正好是一次GC红框部分的前面是GC之前的日志红框部分的后面是GC之后的日志。 -XX:TraceClassLoading 解释监控类的加载。 例如 [Loaded java.lang.Object from shared objects file] [Loaded java.io.Serializable from shared objects file] [Loaded java.lang.Comparable from shared objects file] [Loaded java.lang.CharSequence from shared objects file] [Loaded java.lang.String from shared objects file] [Loaded java.lang.reflect.GenericDeclaration from shared objects file] [Loaded java.lang.reflect.Type from shared objects file] -XX:PrintClassHistogram 解释按下CtrlBreak后打印类的信息。 例如 二、堆的分配参数 1、-Xmx –Xms指定最大堆和最小堆 举例、当参数设置为如下时 -Xmx20m -Xms5m 然后我们在程序中运行如下代码 System.out.println(Xmx Runtime.getRuntime().maxMemory() / 1024.0 / 1024 M); //系统的最大空间 System.out.println(free mem Runtime.getRuntime().freeMemory() / 1024.0 / 1024 M); //系统的空闲空间 System.out.println(total mem Runtime.getRuntime().totalMemory() / 1024.0 / 1024 M); //当前可用的总空间 运行效果 保持参数不变在程序中运行如下代码分配1M空间给数组 byte[] b new byte[1 * 1024 * 1024]; System.out.println(分配了1M空间给数组); System.out.println(Xmx Runtime.getRuntime().maxMemory() / 1024.0 / 1024 M); //系统的最大空间 System.out.println(free mem Runtime.getRuntime().freeMemory() / 1024.0 / 1024 M); //系统的空闲空间 System.out.println(total mem Runtime.getRuntime().totalMemory() / 1024.0 / 1024 M); 运行效果 注Java会尽可能将total mem的值维持在最小堆。 保持参数不变在程序中运行如下代码分配10M空间给数组 byte[] b new byte[10 * 1024 * 1024]; System.out.println(分配了10M空间给数组); System.out.println(Xmx Runtime.getRuntime().maxMemory() / 1024.0 / 1024 M); //系统的最大空间 System.out.println(free mem Runtime.getRuntime().freeMemory() / 1024.0 / 1024 M); //系统的空闲空间 System.out.println(total mem Runtime.getRuntime().totalMemory() / 1024.0 / 1024 M); //当前可用的总空间 运行效果 如上图红框所示此时total mem 为7M时已经不能满足需求了于是total mem涨成了16.5M。 保持参数不变在程序中运行如下代码进行一次GC的回收 System.gc(); System.out.println(Xmx Runtime.getRuntime().maxMemory() / 1024.0 / 1024 M); //系统的最大空间 System.out.println(free mem Runtime.getRuntime().freeMemory() / 1024.0 / 1024 M); //系统的空闲空间 System.out.println(total mem Runtime.getRuntime().totalMemory() / 1024.0 / 1024 M); //当前可用的总空间  运行效果 问题1 -Xmx最大堆空间和 –Xms最小堆空间应该保持一个什么关系可以让系统的性能尽可能的好呢 问题2如果你要做一个Java的桌面产品需要绑定JRE但是JRE又很大你如何做一下JRE的瘦身呢 2、-Xmn、-XX:NewRatio、-XX:SurvivorRatio -Xmn 设置新生代大小 -XX:NewRatio 新生代eden2*s和老年代不包含永久区的比值 例如4表示新生代:老年代1:4即新生代占整个堆的1/5 -XX:SurvivorRatio幸存代 设置两个Survivor区和eden的比值 例如8表示两个Survivor:eden2:8即一个Survivor占年轻代的1/10 现在运行如下这段代码 public class JavaTest {public static void main(String[] args) {byte[] b null;for (int i 0; i 10; i)b new byte[1 * 1024 * 1024];} } 我们通过设置不同的jvm参数来看一下GC日志的区别。 1当参数设置为如下时设置新生代为1M很小 -Xmx20m -Xms20m -Xmn1m -XX:PrintGCDetails  运行效果 总结 没有触发GC 由于新生代的内存比较小所以全部分配在老年代。 2当参数设置为如下时设置新生代为15M足够大 -Xmx20m -Xms20m -Xmn15m -XX:PrintGCDetails 运行效果 上图显示 没有触发GC 全部分配在eden蓝框所示 老年代没有使用红框所示 3当参数设置为如下时设置新生代为7M不大不小 -Xmx20m -Xms20m –Xmn7m -XX:PrintGCDetails 运行效果 总结 进行了2次新生代GC s0 s1 太小需要老年代担保 4当参数设置为如下时设置新生代为7M不大不小同时增加幸存代大小 -Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio2 -XX:PrintGCDetails 运行效果 总结 进行了至少3次新生代GC s0 s1 增大 5当参数设置为如下时 -Xmx20m -Xms20m -XX:NewRatio1-XX:SurvivorRatio2 -XX:PrintGCDetails  运行效果 6当参数设置为如下时 和上面的5相比适当减小幸存代大小这样的话能够减少GC的次数 -Xmx20m -Xms20m -XX:NewRatio1-XX:SurvivorRatio3 -XX:PrintGCDetails 3、-XX:HeapDumpOnOutOfMemoryError、-XX:HeapDumpPath -XX:HeapDumpOnOutOfMemoryError OOM时导出堆到文件 根据这个文件我们可以看到系统dump时发生了什么。 -XX:HeapDumpPath 导出OOM的路径 例如我们设置如下的参数 -Xmx20m -Xms5m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathd:/a.dump 上方意思是说现在给堆内存最多分配20M的空间。如果发生了OOM异常那就把dump信息导出到d:/a.dump文件中。 然后我们执行如下代码 Vector v new Vector(); for (int i 0; i 25; i)v.add(new byte[1 * 1024 * 1024]); 上方代码中需要利用25M的空间很显然会发生OOM异常。现在我们运行程序控制台打印如下 现在我们去D盘看一下dump文件 上图显示一般来说这个文件的大小和最大堆的大小保持一致。 我们可以用VisualVM打开这个dump文件。 注关于VisualVM的使用可以参考下面这篇博客 使用 VisualVM 进行性能分析及调优http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/ 或者使用Java自带的Java VisualVM工具也行 上图中就是dump出来的文件文件中可以看到一共有19个byte已经被分配了。  4、-XX:OnOutOfMemoryError -XX:OnOutOfMemoryError 在OOM时执行一个脚本。 可以在OOM时发送邮件甚至是重启程序。 例如我们设置如下的参数 -XX:OnOutOfMemoryErrorD:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid  上方参数的意思是说执行printstack.bat脚本而这个脚本做的事情是D:/tools/jdk1.7_40/bin/jstack -F %1 D:/a.txt即当程序OOM时在D:/a.txt中将会生成线程的dump。 5、堆的分配参数总结 根据实际事情调整新生代和幸存代的大小官方推荐新生代占堆的3/8幸存代占新生代的1/10在OOM时记得Dump出堆确保可以排查现场问题 6、永久区分配参数 -XX:PermSize  -XX:MaxPermSize 设置永久区的初始空间和最大空间。也就是说jvm启动时永久区一开始就占用了PermSize大小的空间如果空间还不够可以继续扩展但是不能超过MaxPermSize否则会OOM。 他们表示一个系统可以容纳多少个类型 代码举例 我们知道使用CGLIB等库的时候可能会产生大量的类这些类有可能撑爆永久区导致OOM。于是我们运行下面这段代码 for(int i0;i100000;i){CglibBean bean new CglibBean(geym.jvm.ch3.perm.beani,new HashMap()); } 上面这段代码会在永久区不断地产生新的类。于是运行效果如下 总结 如果堆空间没有用完也抛出了OOM有可能是永久区导致的。 堆空间实际占用非常少但是永久区溢出 一样抛出OOM。 三、栈的分配参数 1、Xss 设置栈空间的大小。通常只有几百K   决定了函数调用的深度   每个线程都有独立的栈空间   局部变量、参数 分配在栈上 注栈空间是每个线程私有的区域。栈里面的主要内容是栈帧而栈帧存放的是局部变量表局部变量表的内容是局部变量、参数。 我们来看下面这段代码没有出口的递归调用 public class TestStackDeep {private static int count 0;public static void recursion(long a, long b, long c) {long e 1, f 2, g 3, h 4, i 5, k 6, q 7, x 8, y 9, z 10;count;recursion(a, b, c);}public static void main(String args[]) {try {recursion(0L, 0L, 0L);} catch (Throwable e) {System.out.println(deep of calling count);e.printStackTrace();}} } 上方这段代码是没有出口的递归调用肯定会出现OOM的。 如果设置栈大小为128k -Xss128K  运行效果如下方法被调用了294次 如果设置栈大小为256k方法被调用748次 意味着函数调用的次数太深例如递归调用。 总结 我们在本文中介绍了jvm的一些最基本的参数还有很多参数如GC参数等将在后续的系列文章中进行介绍。我们将在接下来的文章中介绍GC算法。
http://www.yutouwan.com/news/308978/

相关文章:

  • 网站开发与维护专业前景erp企业管理系统手机版
  • 网站建设要规避的新媒体代运营
  • 森网站建设粮油移动端网页设计素材
  • 陕西住房与城乡建设部网站wordpress手机浏览器
  • 网站的空间怎么查深圳网络营销外包公司推荐
  • 正规的网站制作联系方式百度大搜是什么
  • 做推广一般那些网站比较好什么网站可以帮人做ppt赚钱
  • 黑别人网站凡科小程序免费制作平台
  • 书店网站建设个人总结如何做电子书下载网站
  • 宛城区网站制作seo关键词排行优化教程
  • 北京专业网站外包公司国外高清视频素材网站推荐
  • 网站建设公司违法做网站一月工资
  • 网站免费网站的方法网页设计策划书
  • 福建省建设系统网站wordpress 域名 根目录
  • 网站前台模板设计网站上线前需要做什么
  • 河北省建设工程安全生产网站wordpress文章文件
  • wordpress社团网站商标图案参考
  • 个人网站备案需要哪些北京建站模板源码
  • 怎么做网站后期维护wordpress第三方评论
  • 欧美风格网站模版手机电脑同步网站开发
  • 榆次做企业网站河北网站优化公司
  • 安平有做农产品的网站被wordpress关键词插件
  • 如何选择丹徒网站建设河南企业网官方网站
  • 商城网站模版代码长沙做网站找谁
  • 外贸营销型建站网站建设适合的企业
  • 沈阳方正建设监理网站北京公司注册地址查询
  • 供灯放生网站开发中国建筑官网一测二测成绩多少算及格
  • 重庆网站seo按天计费怎么修改wordpress主题字体
  • 网站建设公司的公司排名手机网站的后台管理
  • 济南网站搜索排名北京网站案例