赞
踩
1.Java类加载的过程?
第一个过程是加载,根据类的全限定名称获取该类的二进制流,将二进制流中的静态存储结构转化为方法区的运行时数据结构,在内存中生成该类的Class对象作为该类的数据访问入口。
第二个过程为链接,又分为三步。验证,保证加载的字节流中符合jvm规范,不会危害虚拟机。准备阶段为静态变量赋默认值,并在方法区分配内存。解析将常量池中的符号引用变为直接引用。可参考(请你说说Java类的加载过程_说说类加载的流程-CSDN博客);
第三个过程初始化,为静态变量和静态代码块赋值。
使用:类访问方法区内数据结构接口,对象是堆区的数据。
卸载:通过垃圾回收堆中的对象内存。
2.JVM组成结构?
类加载子系统:通过全限定类名将类的字节码加载到运行时数据区的方法区中。
运行时数据区(jvm内存模型):分为五个部分,方法区,堆区,栈区,本地方法栈,程序计数器。
执行引擎:执行classes中的指令
本地方法栈: 与其他编程语言交互时使用的接口。
3.jvm内存模型?
线程共享的方法区和堆区。方法区存放的类加载的信息、常量、静态变量即时编译后的代码等数据。堆区为实例对象分配内存的地方。
线程私有:虚拟机栈,保存一个个栈帧,栈帧中有局部变量表,操作数栈,动态链接和方法出口。程序计数器,保存下一条指令执行的地址。本地方法栈,调用Native方法的。
4.双亲委派机制?
当类加载器收到加载请求时,会委托父类加载器去加载,依次向父类委托到达最上层启动类加载器。如果父类加载器无法完成加载,则会交给子类加载器去加载。
加载具体加载过程,AppClassLoader加载class时不会自己加载,交给ExtClassLoader,ExtClassLoader交给BootStrapClassLoader加载。如果BootStrapClassLoader加载失败,则由ExtClassLoader加载,ExtClassLoader加载失败则由AppClassLoader加载,如果AppClassLoader加载失败则报出ClassNotFoundException异常。
优势:避免类的重复加载。保护线程安全,防止核心api被随意串改。
5.对象实例化的过程?
1.判断类是是否加载过,检查方法区的常量池能否找到该类的符号引用,能的话通过符号引用检查该类是否加载链接初始化过,没有则在双亲委派的机制下将类信息加载到内存中,生成类的class对象,作为方法区这个类各种数据的访问入口。
2.创建对象。
(1)为对象分配内存空间。内存规整的话采用指针碰撞为新内存分配空间。内存不规整则在空闲列表中找一块空间为对象分配内存。
(2)处理并发安全问题。CAS失败重试,区域加锁,每个线程分配一块TLAB内存缓冲区。
(3)设置对象头信息。将哈希码,GC年龄,锁信息,GC标记等对象头存储在Mark Word中。
(4)成员变量赋初值。
3.执行构造方法,有父类方法,子类则会隐式执行或者显示执行super。 最后执行<init>方法才能创建一个真正的方法。
6.Java如何判断对象是否存活?
引用计数法:给一个对象添加计数器,当一个对象被引用,则计数加一,引用失效计数减一。
可达性分析算法:通过可以被当作GC Root对象作为起始点向下搜索,经过的路径叫引用链,如果一个对象到GC Root没有任何引用链的话,该对象就可以当做回收对象。
判断对象大的回收需要进行二次标记,在第一次发现对象不可达后会对对象进行一次标记,标记的对象会被放在等待回收的集合中,如果重写的finalize()方法,则会将标记的对象放入专门的队列中顺序执行finalize()方法,如果被救活,则被移除,没有救活则进行二次标记等待回收。
GC Root对象可以是:虚拟机栈中的对象,方法区中的静态变量,静态常量,本地方法栈。
7.GC垃圾回收机制
1.标记-清除
先标记,将标记的内存回收
会产生内存碎片,导致大的对象没有内存分配触发GC。创建多个大的对象容易导致频繁GC
2.标记-整理
先使用标记-清除,再将内存进行归整,是内存碎片能够连续。
3.复制
将内存分为两部分,每次使用一块内存,当内存满了以后将存活的对另一块内存中,并将之前内存全部清除。为了提高效率内存按照8:1:1划分为Eden区,Survior区。
4.分代垃圾回收:根据对象的生命周期,将堆分为新生代,和老年代。新生代中的对象存期较短,每次回收较多对象,采用复制算法。老年代对象存活周期较长,一般采用标记整理或者清除算法。
8. 两个常用垃圾回收器?
CMS:(Concurrent Mark Sweep)获得最短回收停顿时间为目标的垃圾回收器,通过标记清除算法。
(1)初始标记:指的是所有被GC Root直接引用的对象,该阶段需要STW。
(2)并发标记:对初始标记的对象进行整个引用链的扫描,在阶段与用户线程并行执行不会STW。
(3)重新标记:对并发标记阶段可能的漏标进行扫描。会产生STW。
(4)并发清除:将标记为垃圾的对象进行清除,该阶段不需要STW。
G1:使用标记整理算法。
(1)初始标记:只标记能被GC Root直接引用的对象(STW)。
(2)并发标记:从GC Root开始对堆对象进行可达性分析,找出存活的对象,与用户线程并发执行,不会STW
(3)最终标记:将遗留的对象进行标记,并STW。
(4)筛选回收:对Region进行数据统计,选择多个Region 构成回收集,把回收集中Region的存活对象复制到空的Region中,再清理掉整个旧 Region的全部空间。 需要STW。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。