`

jvm notes

阅读更多


运行时数据区
     program counter register 程序计数器
          java方法 存 正在执行的字节码指令地址   native方法  为空undefined
          每个线程有一个独立的
          规范没有规定ooM

     vm stack
          线程私有
          一个方法有一个stack frame 存局部变量 操作数栈 动态链接 方法出口   方法调用  压栈 出栈
          如果线程请求的栈深度大于虚拟机允许的  stackoverflowerror
          如果vm stack可以动态扩展 扩展时无法申请到足够的内存  OOM
              private static void oom(int i){
        while(i>1){
            oom(i);
        }
    }

    public static void main(String[] args) {
        oom(2); //28592 call
    }

     native method stack
          对应native方法
          也会sof oom

     java heap  
          线程共享
          存 对象实例
          新生代 老生代  survior
          线程私有的分配缓冲区 thread local allocation buffer
          没有内存完成实例分配 并且无法扩展  OOM    -Xmx  -Xms

     method area 方法区
          线程共享
          类信息 常量 静态变量 (字符串常量池 永久代)
          hotspot  永久代实现方法区(省去为方法区写内存管理) permanent generation
          -XX:MaxPermSize
          OOM
          运行时常量池runtime constant pool  
               class文件常量池  运行期也可以放进去 string.intern() 
               导致OOM


direct memory
     nio 使用时分配
     导致内存区域总和大于物理内存限制  动态扩展时出现OOM    


对象的内存布局
     header      hashcode gc分代 锁状态
     instance data
     padding   占位符

栈容量 -Xss
     每个线程分配栈容量  线程太多可能导致内存不够  栈内存OOM

OOM Error message
     Java heap space
     unable to create new native thread
     PermGen space  //动态生成大量class  大量jsp  osgi
     diect memory //dump文件很小  nio



GC
     引用计数   无法回收循环引用
     可达性分析  GC Roots 可达到的对象
      引用 不等于必要, 解决方法:  强引用  软引用  弱引用  虚引用 

     finalize方法只会被调用一次 下次GC不会调用

     永生代 常量池回收  无用类回收

垃圾收集算法
     标记-清除算法 
          效率问题
          内存碎片问题
     复制算法
          内存变为原来一半
          商业虚拟机用此算法回收新生代
     标记-整理算法
          对老生代使用
          存活对象向一端移动
     分代收集算法
          根据分代使用以上几种算法

内存分配
     小对象直接进入eden
     大对象(需要大量连续内存空间,很长的字符串及数组) 避免经常出现短命的大对象提前触发GC
    
     新对象进入eden,熬过一次Minor GC进入survivor,age设为1,到15岁后进入老生代 
          动态年龄判定

线程快照
     threaddump/javacore
堆转储快照
     headdump/hprof


jvm监控命令
     jps
     jinfo
     jstat -gcutil  vmid
     jmap  堆快照    -heap   -histo
     jhat   分析堆快照文件
     jstack 线程快照

     jconsole
     visualVM
     heap analyzer
     memory analyzer tool

class loader
     任一个类 由类加载器和类本身 确立其在JVM中的唯一性
     从JVM看 2种类加载器
                              C++实现的bootstrap classloader,  JVM的一部分
                              java实现的其他加载器, JVM外部
     java开发人员看
               bootstrap 加载JAVA_HOME/lib下的
               extension 加载JAVA_HOME/lib/ext下的
               application 加载classpath下的
    
     类加载器的层次用组合实现
               加载类的时候首先委托父类,父类没法再自己加载
               不是所有都是这样, jndi等spi、OSGi不是

GC性能指标
     throughput   GC花的时间越少,系统计算吞吐量越大   //适用于后台非实时计算
     pause time   stop the world时间// 实时交互系统很看重,如网站
     frequency     频率
     footprint       a measure of size, such as heap size
     promptness  对象成为垃圾到对象内存重新变为可用的时间间隔

GC设计抉择
     串行  并行
     并发 stop the world
     压缩 不压缩  复制
    

behavior-based tuning
     -XX:MaxGCPauseMillis=n
     -XX:GCTimeRatio=n
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics