Jvm性能分析.docxVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Jvm性能分析--郭银枫JVM内存管理内存模型当JVM运行一个程序的时候,它的内存需要用来存储很多内容,包括字节码、以及从类文件中提取出来的一些附加信息、以及程序中实例化的对象、方法参数、返回值、局部变量以及计算的中间结果。JVM在不同的运行时会对不同的内存区域进行不同的操作,下面详细介绍一下:每个JVM实例有一个方法区和一个内存堆,这两个内存区域是对JVM中所有的线程共享的,所以在这两个区域的操作一定要注意数据的同步问题。每个新的线程启动后,JVM会为它分配私有的PC寄存器[PC registers]和Java堆栈(Java stacks);若该线程正在执行一个非本地Java方法,在PC寄存器的值指示下一条指令执行,该线程在Java内存栈中保存了非本地Java方法调用状态,其状态包括局部变量、被调用的参数、它的返回值、以及中间计算结果。而本地方法调用的状态则是存储在独立的本地方法内存栈里面(native method stacks),这样使得这些本地方法和其他内存运行时的数据区的内容尽可能保证独立。JVM中的内存栈是一个栈帧的组合,一个栈帧包含了某个Java方法调用的状态,当某个线程调用方法的时候,JVM就会将一个新的帧压入到Java内存栈,当方法调用完成过后,JVM将会从内存栈中移除该栈帧。堆内存由于java的堆内存和我们程序开发息息相关,所以我们着重讲一下堆内在的分区和gc策略。持久代(PermanentSpace):对应内存模型中的方法区,存放了加载类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的field信息、类中的方法信息,开发人员通过反射机制访问该区域。在sun jdk中该区默认的最小值为16MB,最大值为64MB,可以通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。堆内存通过-Xms和-Xmx来指定最小值和最大值。通过线上系统将这两个值设置为一样,避免频繁分配堆内存的开销。新生代(New Generation):大多数情况下java程序新建的对象都是从新生代分配内存。新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成。可以通过-Xmn来指定新生代的大小,不同的GC方式会以不同的方式按此值来划分Eden Space和Survivor Space,有的GC还会根据运行情况动态的调整这三个区的大小。旧生代(Old Generation或Tenuring Generation):存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象。新建的对象也有可能直接在此区上分配,主要有两种情况(由不同的GC实现来决定):一种为大对象;另一种为大的数组对象,且数组中无引用外部对象。注意:不同的JDK在内存大小限制方面可能有小的区别,这个我们要注意。内存回收回收算法内存的回收算法主要有复制(Copying)、标记-清除(Mark-Sweep)和标记压缩(Mark-Compact)三种。复制:从根集合扫描出存活的对象,并将存活的对象复制到一块新的完全未使用的空间中。需要开辟新的内存空间。标记-清除:从根集合扫描对象,对存活的对象进行标记,标记完毕后,再扫描整个空间,将未标记的对象回收。产生内在碎片。标记-压缩:从根集合扫描对象,对戚的对象进行标记,标记完毕后,再扫描整个空间,回收未标记的对象,将所有存活的对象都往左端移动,使内存空间连续。成本较高,不产生内存碎片。GC类型JVM根据新生代和旧生代对象存活时间的特征,采用了不同的GC实现。新生代GC串行GC(Serial Copying):根据SurvivorRatio来划分新生代内存,默认Eden占80%,可以调整该参数来改变分配方式。该GC为了避免在扫描过程中引用关系发生变化,采用了暂停应用的方式。串行GC在整个扫描和复制过程中采用单线程的方式进行,适用于单CPU、新生代内在较小及对暂停时间要求不是非常高的应用上。可以通过-XX:+UseSerialGC方式来启动串行GC。并行回收GC(Parallel Scavenge):根据InitialSurvivorRatio来初始化新生代内存空间。对于该GC而言,在启动的时按上述参数初始化了新生代内存,但在运行一段时间后,并行回收GC会根据Minor GC的频率、消耗时间等来动态的调整Eden、S0、S1的大小。分配对象内存时,如果Eden的空间不够,如果此对象的大小大于等于Eden的一半时,就直接在旧生代上分配。在多CPU的机器上其回收时间耗费比串行方式短,适合于多CPU、对暂停时间要求较短的应用上。该GC是Server级别。并行GC也采用Copying算法。通过参数-XX:ParallelGCThread

您可能关注的文档

文档评论(0)

天马行空 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档