码迷,mamicode.com
首页 > 编程语言 > 详细

java 内存管理

时间:2015-12-29 19:39:17      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:java 内存模型 内存泄露

  1. java 内存模型 

    技术分享

    如上图,每个java线程有自己的pc registers和java stacks

    进程内的所有的java线程共享method area和heap

    method area也就是java的持久代

  2. 再来看下heap的结构

    技术分享

    具体的规则一堆一堆的,不再赘述

  3. 如何定位内存泄露呢?

    先看一些常用的命令:

1. jstat -gc pid

           可以显示gc的信息,查看gc的次数,及时间。

           其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

     2.jstat -gccapacity pid

           可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

           如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

           PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

           其他的可以根据这个类推, OCold内纯的占用量。

     3.jstat -gcutil pid

            统计gc信息统计。

     4.jstat -gcnew pid

            年轻代对象的信息。

     5.jstat -gcnewcapacity pid

           年轻代对象的信息及其占用量。

     6.jstat -gcold pid

            old代对象的信息。

     7.stat -gcoldcapacity pid

           old代对象的信息及其占用量。

     8.jstat -gcpermcapacity pid

           perm对象的信息及其占用量。

     9.jstat -class pid

           显示加载class的数量,及所占空间等信息。
     10.jstat -compiler pid

           显示VM实时编译的数量等信息。

     11.stat -printcompilation pid

          当前VM执行的信息。

        一些术语的中文解释:

         S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
         S1C
:年轻代中第二个survivor(幸存区)的容量 (字节)
         S0U
:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
         S1U
:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
          EC
:年轻代中Eden(伊甸园)的容量 (字节)
          EU
:年轻代中Eden(伊甸园)目前已使用空间 (字节)
          OC
Old代的容量 (字节)
          OU
Old代目前已使用空间 (字节)
          PC
Perm(持久代)的容量 (字节)
          PU
Perm(持久代)目前已使用空间 (字节)
         YGC
:从应用程序启动到采样时年轻代中gc次数
        YGCT
:从应用程序启动到采样时年轻代中gc所用时间(s)
         FGC
:从应用程序启动到采样时old(gc)gc次数
        FGCT
:从应用程序启动到采样时old(gc)gc所用时间(s)
         GCT
:从应用程序启动到采样时gc用的总时间(s)

       NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

       NGCMX:年轻代(young)的最大容量 (字节)

         NGC:年轻代(young)中当前的容量 (字节)

       OGCMNold代中初始化(最小)的大小 (字节

       OGCMXold代的最大容量 (字节)

        OGCold代当前新生成的容量 (字节)

       PGCMNperm代中初始化(最小)的大小 (字节

       PGCMXperm代的最大容量 (字节)   

         PGCperm代当前新生成的容量 (字节)

         S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

          S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

         E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

         Oold代已使用的占当前容量百分比

         Pperm代已使用的占当前容量百分比

       S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

       S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

        ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

         DSS:当前需要survivor(幸存区)的容量 (字节)Eden区已满)

          TT持有次数限制

         MTT 最大持有次数限制


举个例子:

执行: jstat -gcutil 15469  1000 300  如果大量有fullgc , 说明可能有内存泄露

          或者vmstat,top 看内存的增长情况

代码定位:

MemoryAnalyzer.exe, jprofiler   来分析dump文件即可,一般就是map之类的容器


来看两个内存泄露的例子:

a . 想象一个生产消费问题,  不停的有大量事件发送过来,  消费处理很慢,  事件不停堆积产生内存增长

b. 待研究:

http://wiki.apache.org/tomcat/MemoryLeakProtection

threadlocal  弱引用



java 内存管理

标签:java 内存模型 内存泄露

原文地址:http://754136.blog.51cto.com/744136/1729660

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!