JVM
JVM模型是包含 堆、栈、方法区、虚拟机栈、程序计数器
其中线程共享的是堆和方法区,其余都是线程私有的
方法区主要存储一些变量一类的
堆主要存储一些对象,对象在死亡后被回收,判定对象是否死亡的方法有一种叫做可达性分析的方法
可达性分析:就是说所有对象都是属于GCRoot树下的子节点,从GcRoot到达对象是有一条引用链的,如果这个引用链无法到达这个对象,就证明这个对象可以被回收
发生GC的时间? yi den se vai vo
GC经常发生的区是堆区,堆区可以细分为新生代、老年代、持久代,新生代还可以分为一个Eden和两个Survivor,比例是8:1
新生代:存放所有新生成的对象
老年代: 在年轻代中经历N次垃圾回收仍存活得对象,将被放在年老代中,故都是一些生命周期较长的对象。
持久代:用于存放静态文件。如java类、方法等
对象优先在 Eden 中分配,当 Eden 中没有足够空间时,虚机将发生一次 Minor GC
新生代的垃圾回收器命名为“full GC” 老年代的GC命名为“major GC”
什么是类加载器?
Java类加载器是Java运行时环境的一部分,负责动态加载Java类到Java虚拟机的内存空间中。
类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统
什么是双亲委派模型?
当一个类加载器收到加载请求的时候,他自己先不会尝试去加载这个类,会委托父类加载器去处理这个请求,
并且依次向上处理,只有当某一个类加载器无法完成加载请i去的时候,自己才会去处理这个请i去
使用双亲委派的好处是什么?
可以确保一个类的全局唯一性,当程序中出现多个限定类名一致的类的时候,可以保证每次只加载其中的一个类
什么是内存溢出和内存泄漏?
内存溢出:当程序无法申请到足够的内存的时候称为内存溢出
内存泄漏:只一个对象不在被程序使用却依旧占据内存的时候称为内存泄漏
对java内存模型的理解,以及其在并发中的应用
1. java内存模型的主要目标:定义程序中各个遍历的访问规则
2. java线程之间的通信由java内存模型控制
3. 所有遍历存储都是主程序,每条线程还都又自己的工作内存,线程的工作内存中保存了该线程使用到变量的主内存副本拷贝,
线程对变量的所有操作必须在工作内存完成,而不能之间兑取主内存中的变量,不同的线程之间无法访问对方工作内存中的变量,
线程间变量的传递均需要通过主内存来完成
说一下强引用、弱引用、软引用、虚引用以及他们和GC的关系
1. 强引用:new出的对象之类的引用,只要强引用还在,永远不会回收
2. 软引用:引用但非必须对象,内存溢出异常之前,回收
3. 弱引用:非必须的对象,对象能生存到i下一次垃圾收集发生之前
4. 虚引用:对生存时间无影响,在垃圾回收时得到通知
Jvm中一次完整的Gc流程(从ygc到fgc)是怎样的,重点讲讲对象如何调用晋升到老年代等
1. 对象优先在新生代区分配,若没有足够的空间,MinorGc;
2. 大对象(需要大量连续的内存空间)直接进入老年代,长期存活的对象进入老年代,如果对象在新生代初始并经过一次MGC后仍存活,
年龄+1,若年龄超过一定限制(15),则被晋升到老年态
你知道几种垃圾回收器,各自优缺点,重点讲下cms,g1
1. 串行收集器:暂停所有应用的线程来工作;单线程
2. 并行收集器:默认的垃圾收集器,暂停所有应用;多线程
3. G1收集器:用于大堆区域,堆内存分割。并发回收
4. CMS收集器:多线程扫描,标记需要回收的实例,清除
JVM主要参数:堆设置、回收器选择(串行、并行、并发收集器)