JVM 内存管理之道_20130707.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JVM 内存管理之道_20130707

* JVM内存回收示例 -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 JVM 内存监控工具 命令行工具 Jstack:查看运行程序的java stack和native stack信息。如果运行的java程序出现线程hang住,jstack就非常有用 Jinfo:查看java进程的配置信息 Jmap:获取java进程 heap 分配快照,对象统计信息,dump 堆到hprof 二进制文件,供其他工具分析 Jstat:各种gc的统计数据 JVM 内存监控工具 可视化工具 Jconsole:观察本地或远程java进程的class,堆,垃圾回收情况。 JVM 内存监控工具 可视化工具 Jvisualvm:观察本地或远程java进程的配置,class,堆,垃圾回收,线程信息统计,线程栈,内存、cpu采用,性能分析等。 JVM 内存监控工具 可视化工具 MAT:eclipse内存分析工具,基于java heap dumps进行分析。可以发现内存漏洞和减少内存消耗,功能强大。 内存泄漏-String陷阱 String str = new String(abcdeffsfasdfasdfasdfasdfas); str = str.substring(1,3); 第一个str会被垃圾回收吗? 内存泄漏-String陷阱 String subString 代码实现: 内存泄漏-String陷阱 正确写法: String str = new String(abcdeffsfasdfasdfasdfasdfas); str = new String(str.substring(2)); DEMO 预防JVM内存泄露 GC调优 分配合适的堆大小 采用合适的垃圾回收器 良好的编程习惯 尽量少用静态对象变量 避免集中创建对象尤其是大对象 不要在经常调用的方法中创建对象 能定义为局部变量的就不要定义为类的变量 跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,提前计算数据量 。。。 * 回到开头的问题 为什么应该尽量避免直接调用System.gc()? Full GC因为需要对整个堆进行回收,造成应用暂停,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC: 年老代(Tenured)被写满 持久代(Perm)被写满 System.gc()被显示调用 * 参考文献 Inside the Java Virtual Machine,Bill Venners 深入理解java虚拟机-JVM高级特性与最佳实践,周志明 QA 在jvm中内存可分为两大类,线程共享内存和线程私有内存。 1、线程共享内存包括: 1)、Method Area a、方法区,这部分存储的是jvm加载的class的信息,常量,静态变量,即时编译器编译后的代码等 2)、Java Heap B、java堆,这部分区域是java的所有对象实例,数组等的所在 2、线程私有内存区: 1)、Program Counter Register a)、程序计数寄存器,每个线程有自己的技术寄存器,存储当前线程执行字节码的地址 2)、JVM Stack a)、jvm栈区,每启动一个线程,jvm就为该线程分配一个栈区,线程调用方法时和方法返回时会进行入栈和出栈操作 3)、Native Stack a)、本地方法栈区,与jvm stack类似,不过此区域是为调用本地方法服务的 Permagment对应Method Area,JVM加载class、常量时进行分配。 Tenured和Enden区构成jvm heap space。新建的对象大部分在enden区域分配,如果enden区域不够才会在tenured区域分配。 垃圾回收时会将enden区域的对象往tenured区转移。 1、对象优先在Eden区域分配 2、大对象直接进入老年代 3、长期存活的对象将进入老年代 JVM自动检测和释放不再使用的内存(不需要显式释放内存) 通常在空闲内存减低到某一水平或内存分配达到某一数量后触发 将一个区域中可达的对象复制到另外一个空闲的区域中,将原区域中所有内容擦除。复制收集的优点在于其效益较高,缺点在于需要一块额外的内存空间。所以适用于小型的垃圾回收。JVM中的MinorGC普遍采用该种算法。 1、非常适合生命周期很短的对象 2、有研究表明98%的java对象只会存活1个GC周期 首先对区域中所有引用进行扫描,将不可达的对象标记出来

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档