码迷,mamicode.com
首页 > 其他好文 > 详细

我对jvm的理解

时间:2020-03-22 14:06:10      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:设置   操作   开启   它的   数据结构   新生代   范围   大小   配置文件   

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深堆和浅堆:
    深堆释放的对象内存大小多余它自己,浅堆只是释放的自己的内存空间

我对jvm的理解

标签:设置   操作   开启   它的   数据结构   新生代   范围   大小   配置文件   

原文地址:https://www.cnblogs.com/nyhhd/p/12545493.html

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