1、jvm的位置?
2、jvm的结构体系?
3、类加载器
1、虚拟机自带加载器
2、启动类加载器
3、扩展类加载器
4、应用加载器
双亲委派机制:第一步:类加载器收到类加载的请求。第二步:将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器。第三步:启动类加载器会去检查是否能加载当前这个类,能加载加结束,使用当前加载器,否则,则抛出异常,通知子类去加载。
总结:向上委托,向下加载。
4、沙箱安全机制
5、native
凡是带了native的关键字,说明java的作用范围达不到了,会去调用底层c语言的语法,会进入本地方法栈,然后调用本地方法接口。JNI的作用:扩展java的使用,融合不同的语言为java所使用。
6、方法区
静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在于方法区中,但是实例变量存在堆内存中,和方法区无关。
7、栈
栈内存,主管程序的运行,生命周期和线程同步。线程结束,栈内存就释放,对于栈来说,不存在垃圾回收问题,一旦线程结束,栈就over。
栈中存放的东西:8大基本引用类型+对象引用+实例的方法。
简单类实例化过程:
子类实例化过程:
8、堆
一个jvm只有一个堆,但堆的大小是可以调节的。堆中细分三个区域:新生区 养老区 永久区。
GC垃圾回收,主要是伊甸园和养老区。经过研究,99%的对象都是临时对象。
在jdk8以后,永久存储区叫元空间。
新生区:伊甸园:类诞生和成长的地方,甚至死亡。
永久区:jdk1.6之前,永久代,常量池在方法区;jdk1.7 永久代,慢慢退化,去永久代,常量池在堆中;jdk1.8之后,无永久代,常量池在元空间。
这个区域常驻内存,用来存放jdk自身携带的class对象,interface元数据,存储的是java运行时的环境或信息,这个区域不存在垃圾回收,关闭这个区域会释放这个区域的内存。
当伊甸园和幸存区都满了走重gc
10 、GC
JVM在进行gc时,并不是对三个进行统一回收,大部分的时候,回收的都是新生代。
GC有两种:轻gc 重gc
GC题目:
jvm的内存模型和分区 详细到每个区域放什么?
堆里面的分区有哪些?Eden from to 老年区 说说他们的特点?
GC的算法1有哪些:标记清除法,标记整理法 复制算法 引用计数法
轻gc和重gc分别在什么时候发生?
轻gc:是在 Eden 区快满的情况下才会触发;
重gc:
- 对于一个大对象,我们会首先在Eden 尝试创建,如果创建不了,就会触发Minor GC
- 随后继续尝试在Eden区存放,发现仍然放不下
- 尝试直接进入老年代,老年代也放不下
- 触发 Major GC 清理老年代的空间
- 放的下 成功
- 放不下 OOM
引用计数法:
复制算法:
好处:没有内存碎片;坏处:浪费了内存空间;
复制算法最佳使用场景:对象存活度低;
标记整理法:
优点:不需要额外的空间。
缺点:两次扫描严重浪费时间,会产生碎片。
标记压缩:
再优化:
总结:
内存效率:复制算法>标记清除法>标记压缩法(时间复杂度)
内存整齐度:复制算法=标记压缩法>标记清除法
内存利用率:标记压缩算法=标记清除算法>复制算法
年轻代:存活率低 复制算法;
老年代:标记清除+标记压缩法;