• 我对jvm的理解


    1.程序计数器:指向当前线程执行的字节码指令文件的地址和行号
       为了在cpu将线程挂起,进行线程切换时,能够记录当前线程的执行进程,正确安全的执行完.
    2.虚拟机栈:(存储当前线程运行的方法的栈帧,只有等方法执行完栈帧才会出栈) 测试看在同一给方法中的多个方法.
      用来执行对应的方法所需的数据,通过对方法的划分又细分为栈帧.
      注意:由于虚拟机栈在数据结构中算是栈,有着先进后出的特点
    每个虚拟机栈又可细分为
      1)局部变量表:32位 8大基础数据类型 double/long(64):分为高32位,和低32位 存储对象的引用地址(取址范围为2的32次方 4g)
      2)操作数栈:存放方法的
      3)动态链接:与java的多态有关
      4)返回地址:

    补充:
      1.jdk1.7以后,静态String
      2.线程共享:方法区(静态,常量,类信息).堆(对象,数组)
      3.jdk小于1.8的 JMM:JVM的内存模型,(思想:年龄分代) 永久代:方法区 , 新生代和老年代为堆
      4.jdk1.8以后 永久代被元空间取代
      5.JMM分配原则: 分配优先往下
        1)对象优先在eden区
        2)大对象直接进入老年代
        3)长期存活的对象进入老年代
      6.在虚拟机的配置文件中虚拟机栈为xss 大小为1m
        -xms 300m 设置堆的内存大小初始为300m,最大为300m
        -xmx 300m 新生代默认为堆内存的1/3,老年代为2/3
        新生代内又划分为 8:1:1 eden:s0:s1
        s0和s1时交换区,采用的复制算法
      7.gc
        1)如果进行了一次gc后还存活,age+1,然后进入新生代中的s0区
        2)GC会根据区域的剩余内存进行判断是否进行清理
        3)如果age等于15时,进入老年代,长期存活的对象进入老年代
        4)动态年龄判断:如果s0中有一部份的对象的内存大于它的50%,则将年龄大的放进老年代
      8.空间分配担保:在将新生代放进的老年代的对象中,
        悲观 老年代频繁发生GC,会发生STW(stop the world)现象,会停止所有线程进行gc
        乐观 (老年代进阶对象,不会触发GC)
      9.GC算法
        1)复制算法:将空间划分为两份,一个预留,一个实际,在进行GC时,将预留的开启,将没被删除的放进预留的内存块,将实际的转换为预留的
        2)标记清除算法:在GC的过程中,将要删除的标记删除,但会产生内存碎片
        3)标记整理算法:在标记删除后,还进行整理,但效率偏低
      10.判断对象是否为垃圾的依据:
        1)判断对象是否可达GCROOTS
      11.内存泄漏:
        方法里new出了很多gc垃圾回收器回收不了的对象
      12深堆和浅堆:
        深堆释放的对象内存大小多余它自己,浅堆只是释放的自己的内存空间

  • 相关阅读:
    C#泛型
    C#接口
    C#委托和事件
    Unity Ray 射线
    C#学习基础
    Graph | Eulerian path
    Careercup | Chapter 8
    Leetcode | Pow(x, n)
    Leetcode | Gray code
    分布式缓存
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12545493.html
Copyright © 2020-2023  润新知