JVM

  1. class文件通过load,link,initialize被加载到JVM中,然后编辑成机器码运行,运行在run-time data area中,最后被回收
  2. 运行时方法区分为:
    1. Program Counter(程序计数器):用来记录当前运行到哪个指令,为线程独有
    2. JVM Stacks(运行栈):为线程独有,每个线程中有一个自己的虚拟机栈,内部存储了Frame栈帧
    3. Native Method Stacks(本地方法栈):为线程独有,如果访问本地方法会用到
    4. Heap(堆):new一个对象时,会放在堆中,为所有线程共享
    5. Method Area(方法区):
      1. 为所有线程共享,class文件的内容放到方法区内,每个类的结构存储在方法区内
    6. 方法区内有Constant Pool常量池
  3. 一个方法对应一个栈帧,栈帧分为:
    1. Local Variables(局部变量表),tips:静态方法中局部变量表没有this
    2. Operand Stacks(操作数栈)
    3. dynamic linking(动态链接)
    4. Return address(返回地址)
  4. Heap(堆)主要涉及垃圾回收部分,在JVM调优中经常涉及
  5. 堆主要用来分配新创建的对象,主要分为两个部分new(新生代),tenured(终身代),新生代主要分为一个eden区和两个survivor区,比例为8:1:1
  6. 如果一个对象非常大,直接放入老年代中,如果是一个正常对象,放入eden区,释放时时间GC回收,回收时发现还被其他引用指向,复制放入survivor0中。第二次GC,如果发现仍然存在,放入survivor1中,循环往复,如果一直循环,放入终身区中。
  7. Garbage Collector(垃圾收集器):
    1. 什么是垃圾对象呢?没有人引用的对象
    2. 引用计数,如果引用数是0,为垃圾对象。循环引用时会发生内存泄露,无法回收。
    3. 根搜索算法,查看一个对象的根对象,能找到根对象的不是垃圾,找不到根对象是垃圾
    4. 什么是根对象呢?
      1. 位于JVM stack的对象
      2. 本地方法栈的对象
      3. 运行时常量池的对象
      4. 方法区中的静态变量
      5. Clazz对象
    5. 新生代用的是copy算法,终生代用的是Mark Compacts算法

发表评论

电子邮件地址不会被公开。 必填项已用*标注