1.Jvm基本结构
Jvm由9部分构成:
类加载子系统、堆、栈、方法区、本地方法栈、PC寄存器、直接内存、垃圾回收器、执行引擎。
2.堆、栈、方法区的作用分别是什么?
方法区:就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。
堆:在java虚拟机启动的时候建立java堆,它是java程序最主要的内存工作区域,几乎所有的对象实例都存放在java堆中,堆空间是所有线程共享的。
栈:每个虚拟机线程都有一个私有的栈,一个线程的java栈在线程创建的时候被创建,java栈中保存局部变量、方法参数、同时java的方法调用、返回值等。
3.如何设置堆空间的大小
-Xms:堆空间的初始值
-Xmx:堆空间的最大值
原则上一般会将两个值设置为一般大,从而可以减少GC的次数
4.常用的垃圾回收算法
复制算法:其核心思想就是将内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的留存对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存的角色,完成垃圾收集。(java中新生代的from和to空间就是使用这个算法)。
标记清除法:就是分为标记和清除两个阶段进行处理内存中的对象,当然这种方式也有很大弊端,就是空间碎片的问题,垃圾回收后空间是不连续的,不连续的内存空间的工作效率要低于连续的内存空间。
标记压缩法:标记压缩法是在标记清除法基础之上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理(java中老年代使用的就是标记压缩法)。
5.新生代和老年代为什么使用不同的算法
新生代GC比较频繁,回收的对象比较多,老年代则相反,经历过N多次GC都没被回收,GC次数较少!
6.主流的垃圾回收器
串行回收器、并行回收器
CMS回收器:并发标记清除,使用标记清除法,主要关注系统停顿时间。
G1回收器:属于分代垃圾回收器,区分新生代和老年代,依然有eden和from/to区,使用了分区算法
7.java 的GC 什么时候回收垃圾?
- 执行 system.gc()的时候
- 新生代对象晋升到老年代的时候,老年代剩余空间低于新生代对象晋升为老年代的速率,会触发老年代回收
- new 一个大对象,新生代放不下,直接到老年代,空间不够,触发Full GC
- 对象没有了引用的时候,下次GC就会被回收掉