JVM组成以类加载方式(双亲委派机制)、jvm垃圾回收

JVM组成

  • 本地库接口、执行引擎、运行时数据区、类加载子系统

运行时数据区:

  • 堆(所有线程共享),元空间(所有线程共享),虚拟机栈(线程隔离)、本地方法栈(线程隔离)、程序计数器(线程隔离)
    堆区:
  • 新生代(eden,s0,s1)、老生

双亲委派:

我们的程序本来是要通过应用类加载器来加载,但是它不会优先加载,它会先委托给他的父亲(扩展类加载器),它的父亲再委托给启动类加载器,也就是委托给它的两个亲人。所谓就叫双亲委派。有加载规则,优先使用爷爷加载,如果没有加载到再使用它爹加载,如果他爹也没有加载到,才到自己加载,如果自己也没有加载到才报ClassNotFountException。再这过程中只要上一级加载到了,下一级就不会加载了。

目的:不让我们轻易覆盖系统提供功能
也要让我们扩展我们功能。

jvm垃圾回收

首先判断对象是否已死; 是否为垃圾
使用:

  • 引用计数算法
  • 可达性分析算法:看对象与垃圾收集的起点GC Roots之间没有可达路径,没有就是已经死了。就可以进行回收。
    选择垃圾收集算法:进行垃圾回收
    常见的几种回收算法:
  • 标记-清除算法:分为标记和清除两个阶段,首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象
  • 复制算法:把内存分为大小相等的两块,每次存储只用其中一块,当这一块用完了,就把存活的对象全部复制到另一块上,同时把使用过的这块内存空间全部清理掉,往复循环
  • 缺点:实际可使用的内存空间缩小为原来的一半,比较适合
  • 标记-整理算法:先对可用的对象进行标记,然后所有被标记的对象向一段移动,最后清除可用对象边界以外的内存
  • 分代收集算法:把堆内存分为新生代和老年代,新生代又分为Eden区、From Survivor和To Survivor。一般新生代中的对象基本上都是朝生夕灭的,每次只有少量对象存活,
  • 新生代因此采用复制算法,只需要复制那些少量存活的对象就可以完成垃圾收集;
  • 老年代中的对象存活率较高,就采用标记-清除或者标记整理算法来进行回收。
  • 虚拟栈:组成
    栈帧组成:在这里插入图片描述
    局部变量int 1 先压入操作数栈
    iadd 出栈 相加 将和压入操作数栈
    在这里插入图片描述

程序计数器记录代码记录的位置,多线程需要程序计数器,确保多线程运行的作用,当线程运行时,线程终止,程序计数器记录线程运行的地址,当再次轮到该线程,程序计数器从记录的位置分派给线程
动态链接:与多态相关。
在这里插入图片描述

在这里插入图片描述
查看java进程使用 查看java进程 使用命令 jps
java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45528650/article/details/108988494