JVM虚拟机内存模型

 

    堆、栈、本地方法栈、方法区、程序计数器之间的关系

    

 

  

    只要有一个线程开始运行,Java虚拟机就会给他在线程栈挖一块自己专属的内存空间,

    程序计数器是每一个线程都有的,程序开始运行的时候就会挖出一个属于他的空间,程序计数器的作用:记录当前的程序运行到这一个行的地址,当线程被其他的线程抢占cpu之后恢复运行的时候,根据这个记录来继续运行

    对象实际是放在堆区中,而对象在栈的局部变量表存放的是在堆中的地址

    静态变量也是放在堆区中的,方法区存放的也是在堆中的地址

    本地方法栈是存放 jvm底层一些由C或C++语言实现的方法的地方

    

    可达性分析算法:将“GC Roots” 对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余的未标记的对象都是垃圾对象。

    GC Roots根节点:线程栈的本地变量,静态变量,本地方法栈的变量等等

 

 

    STW (Stop The Word):停掉用户线程,让Java虚拟机专心做GC

    为什么STW会影响用户的体验还要设计:反证明,如果Java虚拟机没有STW机制,当程序在运行的进程中,产生full GC,使用可达性算法,当线程结束,栈空间被销毁,很多被对象引用的变量会从非垃圾变量变为垃圾变量,这个时候先把用户线程停掉,专心地把垃圾变量清掉,在把用户线程恢复,性能反而会好一些

 

 

 

 

 

 

    

 

posted on 2022-04-06 16:54  迎新  阅读(48)  评论(0编辑  收藏  举报