色阁五月

青草伊人久久综在合线亚洲是通过字节码诠释器编削现时哨程的计数器的值

发布日期:2022-06-10 16:15    点击次数:137

Java内存模子对比参考:Java内存模子

0、弁言(运行时数据区)

JVM中的堆啊、栈啊、步调区什么的,是Java捏造机的内存结构,Java法子启动后,会启动化这些内存的数据。

Java捏造机在践诺Java法子的历程中会把它管理的内存分袂为多少个不同的数据区域。每个区域都有各自的作用。

分析JVM内存结构,主要即是分析JVM运行时数据存储区域。JVM的运行时数据区主要包括:堆、栈、步调区、法子计数器等。

而JVM的优化问题主要在线程分享的数据区中:堆、步调区。

内存结构即是上图中内存空间这些东西,而Java内存模子,透澈是另外的一个东西。

Java中的内存分派:

Java法子在运行时,需要在内存中的分派空间。为了进步运算恶果,就对数据进行了不同空间的分袂,因为每一派区域都有特定的处理数据状貌和内存管理状貌。

具体分袂为如下5个内存空间:

栈:存放局部变量

堆:存放统统new出来的东西

步调区:被捏造机加载的类信息、常量、静态常量等。

法子计数器(和系统联系)

腹地步调栈

1、法子计数器(ProgramCounterRegister)

法子计数器是一块很小的内存空间,它是线程出奇的,不错认看成现时哨程的行号引导器。

一个线程的践诺,是通过字节码诠释器编削现时哨程的计数器的值,来赢得下一条需要践诺的字节码教导,从而确保线程的正确践诺。

为什么需要法子计数器?

咱们清亮关于一个处理器(如果是多核cpu那即是一核),在一个确定的时刻都只会践诺一条线程中的教导,一条线程中有多个教导,为了线程切换不错复原到正确践诺位置,每个线程都需有沉寂的一个法子计数器,不同线程之间的法子计数器互不影响,沉寂存储。

精通:如果线程践诺的是个java步调,那么计数器记载捏造机字节码教导的地址。如果为native[底层步调],那么计数器为空。这块内存区域是捏造机范例中独一莫得OutOfMemoryError的区域。

2、捏造机栈(JavaStack)

又叫Java栈,即是咱们庸碌说的栈

捏造机栈亦然线程出奇的,生命周期与法子计数器疏通,即是咱们平时说的栈,栈形色的是Java步调践诺的内存模子。

捏造机栈-历程细目形色

(1)每创建一个线程,捏造机就会为这个线程创建一个捏造机栈,

(2)捏造机栈暗示Java步调践诺的内存模子,每调用一个步调,就会生成一个栈帧(StackFrame)用于存储步调的腹地变量表、操作栈、步调出口等信息,当这个步调践诺完后,就会弹出相应的栈帧。

如果苦求的栈的深渡过大,捏造机可能会抛出StackOverflowError格外,如果捏造机的兑现中允许捏造机栈动态膨大,当内存不及以膨大栈的技艺,会抛出OutOfMemoryError格外。

栈帧(StackFrame)

栈帧分为三部分:局部变量区(LocalVariables)、操作数栈(OperandStack)和帧数据区(FrameData)。

局部变量区(LocaVariables):局部变量区被组织一个一个从0发轫的字数组,byte、short、char在存储前被调度为int,色阁五月boolean也被调度为int,0暗示false,非0暗示true,long和double占据两个字长。

操作数栈(OperandStack):操作数栈也被组织为一个字数组,但不同于局部变量区,它不是通过数组下标侦察的,而是能过栈的Push和Pop操作,前一个操作Push进的数据不错被下一个操作Pop出来使用。

帧数据区(FrameData)这部分的作用主要有三部分:

常量池中数据的贯通

步调践诺完后处理步调复返,复原调用方现场

步调践诺历程中抛出格外时的格外处理,存储有一个格外表,当出现格外时捏造机查找相应的格外表看是否有对应的Catch语句,如果莫得就抛出格外停止这个步调调用

3、腹地步调栈(NativeMethodStack)

与捏造机栈近似,仅仅是践诺腹地步调时使用的

(腹地步调栈则为JVM使用到的Native步调职业。)

4、步调区(MethodArea)

用于存储已被捏造机加载的类型信息、常量、静态变量、即时编译后的代码等信息。

步调区是线程间分享的,当两个线程同期需要加载一个类型时,只消一个类会苦求ClassLoader加载,另一个线程会恭候。

小结:

静态变量+常量+类信息(版块、步调、字段等)+运行往往量池存在步调区中

拓展本色-常量池分类

常量池大体不错分为:静态常量池,运行往往量池。

静态常量池存在于class文献中,比如频繁使用的javap-verbose中,常量池老是在最前边

运行往往量池:即是在class文献被加载进了内存之后,常量池保存在了步调区中,过去说的常量池指的是运行往往量池。是以呢,探讨的都是运行往往量池

5、堆(Heap)

捏造机顶用于存放对象与数组实例的场所,垃圾回收的主要区域即是这里(还可能有步调区)。

Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放多样类的实例对象。

在Java中,堆被分袂红两个不同的区域:更生代(Young)、老年代(Old)。

更生代又可能分为Eden区,FromSurvivor区和ToSurvivor区,主如若为了垃圾回收。统统的线程分享Java堆,在这里还不错分袂线程出奇的缓冲区(ThreadLocalAllocationBuffer,TLAB)。

堆的大小不错通过参数–Xms、-Xmx来指定。

Java堆只消求逻辑上是贯穿的,在物理空间上不错不贯穿。

什么是更生代?

更生代(YoungGeneration)主如若用来存放更生的对象。

更生代又被进一步分袂为Eden区(伊甸园区)和Survivor区(幸存区,包含空间终点的S0、S1区,梗概说From、To区,莫得先后规矩,是Copying算法的需要)。

大大批情况下,java中新建的对象都是在更生代上分派的,通过Copying算法来进行分派内存和垃圾回收。

什么是须生代?

须生代(OldGeneration)主要存放哄骗法子中生命周期长的内存对象。

在更生代中经过屡次垃圾回收仍然存活的对象,会被存放到须生代中。须生代通过标志/整理算法来算帐毋庸内存。

Thebestinvestmentistoinvestinyourself青草伊人久久综在合线亚洲