JVM体系结构概括
-
-
-
JVM的类加载器
/** * 虚拟机自带的加载器 * 启动类加载器(Bootstrap) -----C++ * 扩展类加载器 (Extension) -----Java * 应用程序类加载器(AppClassLoader) ---java也叫系统类加载器,加载当前应用的classpath的所有类 * -------------------- * 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式 */ public class MyAppClassLoader { public static void main(String[] args) { Object object = new Object(); // System.out.println(object.getClass().getClassLoader().getParent().getParent()); // System.out.println(object.getClass().getClassLoader().getParent()); System.out.println(object.getClass().getClassLoader()); MyAppClassLoader myAppClassLoader=new MyAppClassLoader(); System.out.println(myAppClassLoader.getClass().getClassLoader().getParent().getParent()); System.out.println(myAppClassLoader.getClass().getClassLoader().getParent()); System.out.println(myAppClassLoader.getClass().getClassLoader()); } } 结果: null null 启动类加载器 sun.misc.Launcher$ExtClassLoader@16d3586 扩展类加载器 sun.misc.Launcher$AppClassLoader@dad5dc 用户自定义的类加载器
- 总结:java核心包就是java.xxxx 是最底层搞定c/c++编写的启动类加载器,后续根据功能的加强和扩展,展开了扩展,为javax.xxxx,为扩展类加载器。也可后续定义自己的应用程序类加载器。加载当前应用的classpath的所有类(内有双亲委派机制,和沙箱安全机制)
- 关键点
- (1):什么是类加载器
- (2):有哪四种
- (3):双亲委派机制
- (4):沙箱安全机制
-
方法栈在jdk1.8前叫方法栈,1.8后叫元空间
- Native :是一个关键字;声明有,实现无,(创建一个Native的方法栈,调用底层的c代码或者c++代码【java创建于1995年,最初必须使用c的代码】)
-
PC寄存器
- 记录了方法之间的调用和执行情况,类似排版值日表:用来储存指向下一条指令的地址,也即将要执行的指令代码,他是当前线程所执行的字节码的行号指示器
-
- Native :是一个关键字;声明有,实现无,(创建一个Native的方法栈,调用底层的c代码或者c++代码【java创建于1995年,最初必须使用c的代码】)
-
方法区和堆是线程共享,非线程私有的,其余的都是线程私有,存储每一个类的结构信息
方法区:储存了每一个类的结构信息 方法区是规范,在不同虚拟机里头实现是不一样的,最典型的就是元空间和永久代
-
栈
- 栈管运行,堆管存储
- 栈保存的东西:八种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存分配的
- 栈帧:进入栈的方法,称为栈帧
- 容易出现的栈 错误:栈内存溢出的错误,----该错误定义在java.lang.error下的java.lang.VirtualMachineError下的java.lang.StackOverFlowError,本质为错误,非异常
- 栈帧:进入栈的方法,称为栈帧
- HotSpot是使用指针的方式来访问对象,java堆中会存放访问类元数据的地址,reference存储的就是对象地址
程序=算法+数据结构
程序=框架+业务逻辑 (工作者)
- 堆
- 堆内存逻辑上分为三部分:新生+养老+永久
- 物理上分为五部分:伊甸区 - > 幸存零区 - > 幸存一区 - > 养老区 - > 元空间(jdk1.8后)
jdk8后的虚拟机:
元空间和永久代的区别:
配置VM
配置新生代,养老代的内存空间VM: -Xms1024m -Xmx1024m -XX:+PrintGCDetails
写出报OOM错误的代码:byte[] bytes=new byte[40 * 1024 * 1024]; 会直接报:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
GC回收
- 分代收集算法
- {
- 次数频繁收集的Young区
- 次数比较少的old区
- {基本不动的元空间
}
- 算法 {
- 1 引用计数法
- 2 复制算法 优点:不产生内存碎片 缺点 :复制交换损耗了大量空间
- 3 标记清除 优点:节省很多空间 缺点 :进行了俩次扫描,耗时严重,会产生内存碎片
- 4 标记压缩 —在标记清除的基础上配上了整理内存碎片 缺点:浪费大量时间整理,效率上低于复制算法
} - 特: 标记清除压缩 标记清除和标记压缩的结合,和标记清除一样,当多次gc后才会压缩(不算入算法中)
面试中遇到使用什么算法,回答分代收集算法,在新生代上使用复制算法,在老年代使用标记清除,标记压缩算法
未完待续------