Java 进阶(一) JVM运行时内存模型

Wesley13
• 阅读 292

1.JVM运行时数据区域的划分

a.程序计数器(Program Counter Register)

一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空。

b.JVM栈(Java Virtual Machine Stack)

描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

每一个方法从调用直至执行完成的过程,就对应一个栈帧在JVM栈中入栈到出栈的过程。

c.本地方法栈(Native Method Stack)

与JVM栈发挥的作用非常相似,区别不过是JVM栈为JVM执行Java方法服务,而本地方法栈为JVM使用到的Native方法服务。

d.Java堆(Java Heap)

Java堆是被所有线程共享的一块内存区域,在JVM启动时创建。所有的对象实例以及数组都要在这里分配内存,但是随着JIT编译器的发展,渐渐变得不是那么绝对了。

e.方法区(Method Area)

存储已被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap。

f.运行时常量池(Runtime Constant Pool)

方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池,用于存放编译器生成的各种字面量和符号引用。

g.直接内存(Direct Memory)

不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存区域。

例如:JDK1.4中新引入的NIO(New Input/Output)类,一种基于通道与缓冲区的I/O方式,可以使用Native函数库直接操作堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用,避免了在Java堆和Native堆中来回复制数据。

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
2个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。 language JavaScript "name": "vuecliversion2", "version": "1.0.0", "desc
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
2个月前
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
红烧土豆泥 红烧土豆泥
1年前
(转载)Java内存区域(运行时数据区域)和内存模型(JMM) - czwbig
转载自:Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Stella981 Stella981
1年前
JVM内存模型和类加载机制
### JVM内存模型 Java代码是运行在Java虚拟机(JVM)上的,Java虚拟机通过解释执行(解释器)或编译执行(编译器)来完成。 Java内存模型分为5个部分:方法区(Method Area),Java堆(Heap),Java栈(VM Stack),本地方法栈(Native Method Stack),程序计数器(PC 寄存器) ![](ht
Stella981 Stella981
1年前
JVM内存区域划分
JVM内存区域划分 ========= 一、JVM运行时数据区划分 ------------- * * * 根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,如下图所示:**方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器**。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。 ![](https
Wesley13 Wesley13
1年前
java之jvm
1.JVM内存模型 _线程独占:栈,本地方法栈,程序计数器 线程共享:堆,方法区_ 回答以上问题是需回答两个要点: 1\. 各部分功能 2\. 是否是线程共享 2.JMM与内存可见性 JMM是定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存操作.由于指令重排序,读写的顺序会被打乱,因此JMM需要
Stella981 Stella981
1年前
JVM技术总结
1.程序计数器:记录正在执行的虚拟机的字节码的指令地址。 2.java虚拟机栈: 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 该区域可能抛出以下异常: 1. 当线程请求的栈深度超过最大值,会抛出
Wesley13 Wesley13
1年前
java运行时数据区
运行时数据区包括以下几个部分:程序计数器,堆,java栈,本地方法栈,方法区 1.程序计数器:当CPU需要执行指令时,需要从程序计数器中获取当前需要执行的指令所在存储单元的地址。用来指示执行哪条指令。 其大小不会随程序的执行而发生改变。 2.Java栈:java方法执行的内存模型。存放的时一个个栈帧,每个栈帧对应一个被调用的方法。   栈帧中包括:局