JVM的内存模型详解_jvm内存模型及作用

createh52个月前 (02-05)技术教程11

总体架构图中,JVM内存模型主要包括三个系统:

  1. 类加载系统:负责加载Java类的字节码文件,并将其转换为JVM内部的数据结构。
  2. 运行时数据区:用于存储JVM运行时需要的各种数据
  • 方法区:存储类的结构信息(如类、方法、构造函数等)、运行时的常量池等。
  • 堆:存储JAVA对象实例及数组,是垃圾回收的主要区域,它主要分为新生代和老年代,刚创建的对象在新生代的Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就进入老年代,这是按照一种回收机制进行划分的,不是固定的,若堆空间不够,则会包OutOfMemoryError。
  • 栈:包含虚拟机栈、程序计数器、本地方法栈。

虚拟机栈:线程私有的,与线程在同一时间创建、每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小),当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。

程序计数器:线程私有的,同时它也被称为PC寄存器,当线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,生命周期与线程一致,生命周期随着线程启动而产生,随线程结束而消亡。每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。

本地方法栈:线程私有的,与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法(C语言),都会抛出OutOfMemoryError和StackOverFlowError

  1. 执行引擎:负责执行JVM中的字节码指令。

执行引擎是 java 虚拟机的最核心组件之一,它负责执行虚拟机的字节码,采用解释执行方式。解释执行是指解释器通过每次解释并执行一小段代码来完成.class程序的所有操作。即时编译则是将.class文件翻译成机器码在执行。

Java程序的每一个线程都是一个独立的虚拟机执行引擎的实例。从线程生命周期的开始到结束,它要么在执行字节码,要么执行本地方法。

相关文章

JOL:Java 对象内存布局_java内部对象

如果想要深入的学习 synchronized 关键字,必须提前掌握的一部分知识就是 Java 对象内存布局。通过这篇文章一起探索 Java 对象在虚拟机中是如何保存的。在正式学习后续内容之前,先约定如...

求你了,别再说 Java 对象都是在堆内存上分配空间了

作者 l Hollis本文经授权转载自Hollis(ID:hollischuang)Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定...

java 二维数组开发五子棋(控制台版)人人对战

主要使用到的技术:java基础语法java面向对象思想java数组,二维数组java异常处理主要步骤和思路:1,制作一个棋盘类。棋盘类里面有行属性,列属性,二维数组属性。 有一个打印棋盘的方法。 做一...

详解 java.util.Arrays 的使用技巧

创建我们来看看,使用Arrays 怎么创建一个新的数组,一般来说,我们可以使用Arrays 的 copyOf , copyOfRange 和 fill 方法。copyOf 和 copyOfRange要...

Java Valhalla Project_阿斯顿马丁valhalla

Valhalla项目的动机和原因在本文中,我们将介绍Valhalla项目——它的历史原因、当前的开发状态,以及它发布后为日常Java开发人员带来了什么。Valhalla项目的动机和原因Oracle的J...

JVM对象的创建过程_java创建对象的语句

对象的创建过程new对象image-202302261445419191:首先判断这个类有没有加载过,没有加载过的先加载到我们JVM内存中。2:分配内存指针碰撞:默认使用,如果JVM堆中内存绝对规整,...