JVM详解(三&四)运行时数据区

在这里感谢尚硅谷JVM(宋红康),在此记录一下自己详细对学习笔记,希望对你有所帮助。

视频地址
代码地址

chapter03&04运行时数据区

前面学习了类加载子系统

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。

一个进程(一个虚拟机实例)对应一个红***域一个线程对应一个灰***域

一个栈帧对应一个方法

程序计数器(pc寄存器)

若多个线程都要用

优化主要针对于堆空间方法区,虚拟机因只是出栈、入栈的结构,不需优化

95%集中在堆区,5%集中在方法区。

方法区在JDK8以后被换成了元空间,使用的是本地内存,一般情况不会出现内存溢出。

JDK8之前之后的方法区

一个JVM实例对应一个RunTime实例,对应一个运行时数据区,一个进程

●线程是一个程序里的运行单元。JVM允许- 一个应用有多个线程并行的执行。
●在Hotspot JVM里, 每个线程都与操作系统的本地线程直接映射工
➢当一个Java线程准备好执行以后,此时一个操作系统的本地线程
也同时创建。Java线程执行终止后,本地线程也会回收。
●操作系统负责所有线程的安排调度到任何一一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。

●如果你使用jconsole或者是任何一个调武工具,都能看到在后台有许多线程
在运行。这些后台线程不包括调用public static void main (String[])的main线程以及所有这个main线程自己创建的线程。
●这些主要的后台系统线程在Hotspot JVM里 主要是以下几个:
➢虚拟机线程:这种线程的操作是需要JVM达到安全点才会出现。这些操作必须在不
同的线程中发生的原因是他们都需要JVM达到安全点,这样堆才不会变化。这种线
程的执行类型包括”stop- the-world"的垃圾收集,线程栈收集,线程挂起以及
偏向锁撤销。
➢周期任务线程:这种线程是时间周期事件的体现(比如中断),他们一-般用于周期性
操作的调度执行。
➢GC线程:这种线程对在JVM里不同种类的垃圾收集行为提供了支持。
➢编译线程:这种线程在运行时会将字节码编译成到本地代码。
➢信号调度线程:这种线程接收信号并发送给JVM,在它内部通过调用适当的方法进
行处理。

程序计数器(PC寄存器)

JAVA8以后在垃圾回收方面有一些变化

JDK

JDK8

JVM中的程序计数寄存器(Program Counter Register) 中,Register 的命名源于
CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有 把数据装载到寄存器才能够运行。
这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

●它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
●在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
●任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefined) 。

因为这是一个JAVA层面的

●它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础
功能都需要依赖这个计数器来完成。
●字节码解释器工作时就是通过改变这个计数器的值来选取下–条需要执行的字节码指令。
●它是唯一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

偏移地址,PC寄存器中存储的

下面给出例子进行解释

PC寄存器为什么会被设定为线程私有?

我们都知道所谓的多线程在一个特定的时间段内只会执行其中某-一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前商5码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

以上为单核

由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。

这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。

串行与并行

串行:线程排成队依次被cpu执行。同一个时间点只有一个线程执行

并行:多个线程同时执行

并发:一个核快速地去切换线程,让他们看着像是并行,其实是并发

垃圾回收器中【之后会讲到】:

串行:用户线程跟垃圾回收线程不能同时执行。垃圾回收线程只能有一条

并行:垃圾回收线程可以有多条,但这时候用户的线程就在一个停止的状态

并发:用户线程跟垃圾线程是可以同时进行的(不一定是并行的,也肯能是交替的)

全部评论

相关推荐

07-25 10:53
门头沟学院 Java
投递简历一星期多了,一直卡在第一个环节没进展是不是已经没戏了
Peter____G...:其他大厂都过了,甚至在字节实习了,但是莉莉丝简历依旧秒挂
投递莉莉丝游戏等公司10个岗位
点赞 评论 收藏
分享
07-24 13:43
门头沟学院 Java
longerluck...:我猜说的是“你真**是个天才”
投递美团等公司10个岗位
点赞 评论 收藏
分享
求offer的大角牛:简历写的第一乱,没有突出重点,第二项目太多太杂看不出来有啥核心技术,第三自我评价太多了,第四获得的荣誉没啥含金量,可以不写,反正问题不少
点赞 评论 收藏
分享
积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务