JVM
JVM内存划分?
程序计数器,虚拟机栈,本地方法栈,堆,和方法区。
其中堆和方法区线程共享。
Java运行时的数据区包括:(其中前两个是线程共享的)
1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存
3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Frame(方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
4.本地方法栈(Native Method Stack) 与虚拟机栈了类似,不过则为虚拟机使用的到的Native方法服务。(有的虚拟机譬如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一)
5.程序计数器(Program Counter Register) 可看作当前线程所执行的字节码的行号的标识器
JVM内存溢出
答:主要是有堆内存溢出和栈内存溢出,堆内存溢出可能是由于大量创建新的对象导致堆内存会溢出,栈内存溢出可能是我们死递归一个方法时导致的栈内存溢出。
类加载机制
将class文件加载到jvm方法区中,在对应堆区上创建对象,来封装方法区上的数据结构。
双亲委派模型
类加载器: 类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。
启动类加载器,扩展类加载器,应用程序类加载器。
当一个类加载器接收到加载类的指令时,会先让这个类加载器的父类加载器进行加载,如果父类加载器不能进行加载,这时才由子类加载器进行加载。
双亲委派模型的作用
保证优先加载内部基础类,避免出现了自定义类覆盖基础类的情况,提升安全。
垃圾回收机制GC
有哪些判断是否为回收对象的算法?
答:引用计数法:对一个引用对象创建一个计数器,当引用该对象时,计数器+1,释放该对象时计数器-1,当计数器为0时,可进行回收。
可达性算法:将GC roots对象作为起点,向下进行搜索,搜索路径成为引用链,如果一个对象到GC roots没有任何引用链时,GC可对该对象进行回收。
GC清除算法
1.标记-清除算法
将标记的对象直接清除,但容易产生内存碎片。
2。标记-复制(新生代回收算法)
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一
块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区
域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情
况,只需要移动堆顶指针
3。标记-整理(老年代回收算法)
标记要清除的对象后,将存活对象向内存一端进行移动,然后进行清除。
JVM有哪些垃圾回收器?他们的区别有什么?
答:新生代垃圾收集器:Serial,ParNew,Parallel Scaveng
老年代收集器:Serial Old,Parallel Old, CMS
全区收集器:G1
区别:
复制算法:Serial、ParNew、Parallel Scavenge
标记清除:CMS
标记整理:Serial Old、G1、Parallel Old