JVM体系结构
组成
计算机的组成分为:数据、指令和控制三部分。同样JVM在大致上也可以如此区分为:
数据:方法区、Heap堆
指令:程序计数器、虚拟机栈、本地方法栈。(可以通过javap -c -v xxx.class > yyy.txt查看指令)
-
程序计数器:指向当前线程正在执行的字节码指令的地址(行号)
-
虚拟机栈:每个方法在执行的时候都会创建一个对应的栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。方法是由线程执行的,线程只是一个执行体,所以也会存储在虚拟机栈中。 stackoutflowerror
-
本地方法栈:虚拟机使用native方法的服务
-
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。(class文件等)
-
堆(heap):java虚拟机中所管理的内存中最大的一块,所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的是存放对象实例,几乎所有的对象实例都在这里分配内存。outofmemorryerror
概览
java gc 主要回收的是 方法区 和 堆中的内容
类加载器
- 类加载器是什么(1,Custom ClassLoader 2,App ClassLoader 3,Extension ClassLoader 4,Bootstrap ClassLoader)
- 双亲委派机制(1,自底向上检查类是否已经加载;2,自顶向下尝试加载类)
- Java类加载的沙箱安全机制
常见的垃圾回收算法
- 引用计数
在双端循环,互相引用的时候,容易报错,目前很少使用这种方式了
- 复制
复制算法在年轻代的时候,进行使用,复制时候有交换
优点:没有产生内存碎片
- 标记清除
先标记,后清除,缺点是会产生内存碎片,用于老年代多一些
- 标记整理
标记清除整理
但是需要付出代价,因为移动对象需要成本