JVM组成部分
- 类加载子系统
加载class文件从硬盘加载到内存 - 执行引擎
执行指令、执行垃圾回收 - 运行数据区
堆【存new出来的对象】、java虚拟机栈【存局部变量】、本地方法栈【存native方法的局部变量】、程序计数器【记录当前执行的字节码行数、选取下一个指令】、方法区【加载的类信息、常量、静态变量、、】 - 本地方法区
调用c/c++的接口【使用native关键字的方法】
垃圾回收机制
- 回收算法
- 复制算法
将内存分为两个部分from区和to区,所有对象存储在from区,回收时将所有存活的数据移动到to区,然后to区变成from区; - 标记清理算法
根据对象是否存活将死亡的对象标记后清理; - 标记整理算法
根据对象是否存活将死亡的对象标记后清理,然后将存活的对象整理到内存的一端; - 分代算法
根据对象存活周期不同,将内存分为几个空间【新生代、老年代、元空间】;
- 复制算法
- jvm内存分配
-
新生代
新生代都是年龄比较小的对象需要回收的可能比较大采用复制算法进行垃圾回收【将内存分为两个分区,回收时将存活的对象统一迁移到另一个区,然后将当前分区清空】;
好处:效率高,不用考虑内存碎片;
坏处:内存中能使用的部分只有原来的一半【另一半用来复制】;- 伊甸区
新创建的对象进入伊甸区 - 幸存者区
- from区
- to区
经历过普通GC之后从伊甸区与from区幸存下来的对象进入到to区;
经历过GC后to区变成from区【from区和to区是在变换的】,幸存下来的对象年龄+1; - 伊甸区
-
老年代
对象年龄超过设置值时进入到老年代中【默认15岁,-XX:PretenureSizeThreshold可以设置】;
老年代都是经历过多次回收年龄比较大的对象采用标记整理算法进行垃圾回收【将可回收对象清理后,将所有存活对象整理到一端,避免内存碎片问题】; -
元空间
元空间存储的程序运行时的结构数据【Class对象、字节码、常量池、、】; 完全GC的时候才清理;
-