-
谈谈你对JVM的理解?java8虚拟机的更新?
-
什么是OOM?什么是栈溢出StackOverFlow?
-
JVM的常用调优参数有哪些?
-
内存快照如何抓取?怎么分析Dump文件?
-
类加载器的认识?
学了之后来回答!
1.体系结构
位置-->操作系统之上,包含于JRE之中
2.类加载器+双亲委派机制
双亲委派理解:有相同名字的类-->去找最内层的类加载器的方法(向上委托)
-->保证安全
app-->ext-->boot
3.沙箱机制
安全-->限制代码对资源的访问
4.native+方法区
native:
java作用范围达不到了,要去调底层c语言的库了-->进入本地方法栈,调用本地方法JNI接口,调用本地方法库
-->拓展java使用,融合多种编程语言
方法区:
线程共享,共享区间!
接口,构造方法,静态常量,变量,运行常量池
方法区是所有线程共享的内存,在java8以前是放在JVM内存中的,由永久代实现,受JVM内存大小参数的限制,在java8中移除了永久代的内容,方法区由元空间(Meta Space)实现,并直接放到了本地内存中,不受JVM参数的限制(当然,如果物理内存被占满了,方法区也会报OOM),并且将原来放在方法区的字符串常量池和静态变量都转移到了Java堆中
5.HotSpot+堆
我们基本都用HotSpot
堆:一个JVM只有一个Heap,内存大小可以调节
放置:实例化的类对象所有信息-->
-
新生区
-
伊甸园
-
幸存0区-->在垃圾回收活下来了
-
幸存1区-->和0是动态的,交换位置
-
-
老生区-->超过n次垃圾回收活下来了-->XX:MaxTenuringThreshold=n可以自己设定
-
永久区(java8已经没了,改成元空间)
6.新生区,老年区,永久区
-
所有new的对象从伊甸区出来
-
伊甸园满了-->MinorGC-->幸存区
-
伊甸园,幸存区都满了-->MajorGC-->老年区
-
老年区满了-->FullGC
永久:一些java运行时的环境,不存在垃圾回收
项目中突然出现oom故障,如何排除?-->内存快照分析工具Jprofiler,MAT
7.GC
作用区:方法区,堆
-
引用计数-->JVM不用-->判断是否还存活
计数器本身有消耗!死循环!
-
复制算法
描述一下步骤:
1.Eden到幸存区,道德那个地方变成了from,另一个就是to
2.Eden和from里面的都到to,to变成from,from变成to-->每一次轻GC后Eden和to都是空的
优点:没有内存碎片==缺点:浪费内存的空间
-
标记清除
标记的留下,没标记的清除
进阶:压缩