jvm框架

好久没有写文章啦,今天给大家总结一波jvm框架,希望对大家有所帮助哦。

首先看一张jvm框架图

jvm框架_第1张图片

方法区:

方法区是一块所有线程共享的内存区域。它用于保存系统的类消息,比如类的字段、方法和常量池等。

Java堆:

线程共享,几乎所有的对象实例都放在java堆中,并且java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显示地释放。Java堆最常见的一种构成是将整个java堆分为新生代和老年代,新生代有可能分为eden区、s0区、s1区,s0和s1也称为from和to区间。

直接内存:

Java的NIO()库允许java程序使用直接内存。直接内存是java堆外的、直接向系统申请的内存区间。通常,访问直接内存的速度优于java堆。因此出于性能考虑,读写频繁的场合可能该会考虑使用直接内存。由于直接内存在java堆外,因此它的内存不会直接受限于Xmx指定的最大堆大小,但是系统内存是有限的,java堆和直接内存的综合依然受限于操作系统能给出的最大内存。

Java栈

Java 堆是和程序数据密切相关,java栈就是和线程执行密切相关。线程执行的基本行为是函数调用,每一次函数调用都是通过java栈传递的。Java栈是先进后出,java栈中主要保存的内容为栈帧,每一次函数调用就会有一个栈帧被压栈,每一次函数调用结束就有一个栈帧被弹出java栈。当前执行的函数所对应的栈帧就是当前的帧(位于栈顶)。

栈帧中保存当前函数的局部变量、中间运算结果等数据。一个栈帧至少包含局部变量表、操作数栈和帧数据区几个部分。

局部变量表

用于保存函数的参数以及局部变量。由于局部变量表在栈帧中,因此如果函数的参数和局部变量比较多,会使得局部变量表膨胀,从而每一次函数调用就会占用更多的栈空间,最终导致函数的嵌套调用次数减少。

操作数栈

操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量的临时存储空间。也是先进后出的数据结构。

帧数据区

帧数据区支持常量池解析、正常方法返回和异常处理。大部分的java字节码需要进行常量池访问,在帧数据区中保存着访问常量池的指针,方便程序访问常量池。

 

栈上分配

这是java虚拟机提供的一项优化技术,基本思想是对于那些线程私有的对象(这里指的是不可能被其它线程访问的对象),可以将它们打散分配在栈上。而不是分配在堆上。分配子啊栈上的好处是可以在函数调用结束之后自行销毁,而不需要垃圾回收器的介入,从而提高系统性能。

技术基础:逃逸分析即判断一个对象的作用域是否有可能逃出函数体。


你可能感兴趣的:(java)