JVM

发布时间 2024-01-02 19:45:40作者: 卡皮巴拉
  • 内存运行模型
  • 常量优先被jvm加载;
  • 方法区:关于类的信息都存在方法区,是共享的;
  • 堆:存储对象和数组,也是共享
  • 程序计数器:存储程序运行到哪个位置;
  • 本地方法栈:是Native;
  • 栈区:每个方法运行的过程,运行完压栈
    • 动态连接:对象的内存地址;
  • 垃圾回收
  1. 垃圾回收器回收的是堆里的;
  2. 回收对程序没有意义的对象;
  3. 引用计数算法:
    1. 引用计数算法是在对象中加入一个计数器,当对象被引用,计数器+1,当引用失效,计数器-1,当计数器的值编程为0,就是没有任何一个变量来引用这个对象,那么这个对象就是垃圾;
    2. 缺点:这种算法实现简单,效率高,但是有一个严重的问题会导致内存泄漏,那就是对象之间循环引用,比如说A对象持有B对象的引用,B对象持有A对象的引用,那么A和B的计数器值永远>=1,也就是说这两个对象永远不会被回收,这是一堆垃圾。
  4. 可达性分析算法:
    1. Java中定义了一些起始点,称为GC Root,当有对象引用它的时候,就把对象挂载在它下面,形成一个树状结构,当一个对象处于一个这样的树里时,就认为此对象是可达的,反之是不可达;
  5. GCROOT包含什么:
    1. 虚拟机栈中正在引用的对象;
    2. 本地方法栈中正在使用的对象;
    3. 类中静态属性引用的对象;
    4. 常量应用的对象;
  6. 垃圾收集算法:
    1. 标记清除法:
      1. 缺点:
        1. 一个是效率问题,标记和清除过程的效率都不高;
        2. 另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
    2. 标记复制:
      1. 缺点:
        1. 空间浪费,同一时间只能用一半的空间;
    3. 标记整理:标记出正在使用的,把这些正在使用的整理到一边
    4. 分代收集算法:
      1. 刚new出来的放到新生代中;
      2. 当一个对象经历多次GC后,还是可达的,说明jvm觉得这个对象比较重要不会轻易被回收,就把这个对象加入到老年代区域;