浅谈JVM
-
JVM的位置
装在操作系统上,相当于一个软件(用C写的),来跑Java程序
-
JVM的体系结构
先将编写的
.java
文件通过javac
命令编译为Class File
,然后进入ClassLoader
-
类加载器
用于加载Class文件,初始化得到Class对象,该对象即可用于new实例化对象。分为:
-
启动类(根)加载器(rt):获取不到,可能含有其他语言代码(上面还有虚拟机再带的加载器)
-
扩展类加载器(Ext)
-
应用程序加载器(App)
-
-
双亲委派机制
即上面三个加载器优先级从高到低,优先执行根加载器的类,若无再往下找,从而保障一些安全问题,如防止外层恶意代码干涉内层代码:防止自己定义的
String
类(app中)修改了java.lang.String
(rt中),这种情况下自己定义的类不会被执行。 -
沙箱安全机制
由字节码校验器(确保遵循Java语言规范)和类加载器组成,将代码归入保护域,确定其可以进行哪些操作,主要限制代码对系统资源访问。
-
Native
(面试加分项)凡是被
Native
关键字修饰的方法,说明其超出Java作用域调用了底层C语言库。该方法放在本地方法栈中,使用时再调用本地方法接口(JNI)。从而扩展Java使用,融合不同语言。 -
堆内存(Heap Space)
还有元空间(方法区),逻辑上存在,物理上不存在
GC垃圾回收主要针对新生区和养老区
堆内存溢出(OOM)可先手动把虚拟机中堆内存调大并打印GCDetails信息,若仍然报错则考虑代码问题,可通过JPofiler工具(需安装idea插件),从而分析Dump文件,定位内存泄漏位置,获取大的对象。
-
还需自行去看
JUC
和JMM
,面试高频问