内存模型,类加载,垃圾回收

1,
volatile修饰的变量(共享变量,非线程安全),在工作内存发生了变化后,必须要马上写到主内存中,而线程读取到volatile修饰的变量时,必须去主内存中去获取最新的值,而不是读工作内存中主内存的副本,这就有效的保证了线程之间变量的可见性
适用条件:对变量的写操作不依赖当前值
内存模型:线程的工作内存,主内存
内存区域:
什么时候垃圾回收 看对象是否可达 a->b ab均不可达 系统中没有指向a的对象 b有 但向上查询时没有 root
堆内存溢出 对象太多 线程共享
栈内存溢出 线程太多或者压栈太深 线程私有
方法区 加载的累太多 线程共享,他用于存储已被虚拟机加载的类信息,常量final,静态变量static
程序计数器 线程私有
本地方法栈 线程私有

2,

引导类加载器 加载jvm环境 rt.jar 如java.lang
扩展类加载器 核心jar报类库 ext目录下的jar
系统类加载器 程序类
自定义加载器
加载 验证 准备 解析 初始化
加载:1通过类限定名来获取类的二进制字节流 2,讲字节流的静态数据结构转化为方法区的运行时数据结构 3在java堆中生成一个代表此类的class对象,作为方法区的访问入口。
验证:class文件不一定来自于java代码 语法规则验证
准备:正式为类变量分配内存,在方法区完成
解析:常量的符号引用转为直接引用
初始化: 执行类构造器方法 完成初始化 先执行父类的构造器方法 static int a=123;

3,

内存回收线程优先级低   root可不可达来判断对象是否回收 内存不足 就会触发回收

gc策略 新生代回收(算法是复制回收算法)minor gc 老年代也回收fullgc

新生代8:1:1 eden from to
from to只有一个有数据 from复制到to区 一次垃圾回收年纪加1 大多数对象消亡快 所以eden区80% survivor20%
1、将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
2、当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
老年代对象来自新生代 新:老1:2

Minor GC:简单理解就是发生在年轻代的GC。
Minor GC的触发条件为:当产生一个新对象,新对象优先在Eden区分配。如果Eden区放不下这个对象,虚拟机会使用复制算法发生一次Minor GC,清除掉无用对象,
同时将存活对象移动到Survivor的其中一个区(fromspace区或者tospace区)。虚拟机会给每个对象定义一个对象年龄(Age)计数器,对象在Survivor区中每“熬过”一次GC,年龄就会+1。
待到年龄到达一定岁数(默认是15岁),虚拟机就会将对象移动到年老代。如果新生对象在Eden区无法分配空间时,此时发生Minor GC。发生MinorGC,对象会从Eden区进入Survivor区,
如果Survivor区放不下从Eden区过来的对象时,此时会使用分配担保机制将对象直接移动到年老代。

Major GC的触发条件:Major GC又称为Full GC。当年老代空间不够用的时候,虚拟机会使用“标记—清除”或者“标记—整理”算法清理出连续的内存空间,分配对象使用。

posted @ 2019-04-03 15:24  song123666  阅读(164)  评论(0编辑  收藏  举报