Java虚拟机系列之Java内存结构简介

简介: 本文我们将讲解Java虚拟机中各个区域以及各个区域的作用。一.程序计数器什么是程序计数器,有什么作用?程序技术器是一块比较小的内存区域,主要当做是线程中所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一个执行的字节码命令,分支、循环、跳转等基础功能都是依赖这个程序计数器来完成。

本文我们将讲解Java虚拟机中各个区域以及各个区域的作用。

一.程序计数器

什么是程序计数器,有什么作用?

程序技术器是一块比较小的内存区域,主要当做是线程中所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一个执行的字节码命令,分支、循环、跳转等基础功能都是依赖这个程序计数器来完成。

有什么特点?

Java虚拟机中的多线程是通过线程轮流切换分配处理器执行时间的方式来实现的,所以为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,所以是线程私有的。

注意:

如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器的值为空,此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemory的情况的区域

二.Java虚拟机栈

Java虚拟机栈是干嘛的?

Java虚拟机栈描述的是Java内存模型,每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行结束对应着一个栈帧在虚拟机栈中入栈出栈的过程。

有什么特点?

Java虚拟机栈是线程私有的,而且生命周期和线程相同。

注意:

如果线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常;如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够多的内存,就会抛出OutOfMemoryError异常。

三.本地方法栈

与虚拟机栈发挥的功能类似,区别不过是虚拟机栈为虚拟机执行Java方法,本地方法栈为虚拟机用到的Native方法服务。本地方法栈也会抛出StackOverFlowError和OutOfMemoryError异常。

四.Java堆

什么是Java堆,有什么作用?

Java堆是Java虚拟机中所管理内存中最大的,是所有线程共享的一块内存区域,在虚拟机启动的时候创建,目的是存放对象实例。

有什么特点?

几乎所有的对象实例都在这里分配内存,因此这也是垃圾收集器管理最主要的区域,而且Java堆可以处于物理不连续的内存空间,只要逻辑连续即可

1、Java堆中还细分新生代和老年代,然后新生代中又分为Eden区域、From Survivor空间、To Survivor空间等。

2、这里的Java堆的垃圾回收算法是使用了分代收集算法,即新生代中使用“复制”算法,而老年代中使用“标记-清理”算法或“标记-整理”算法。

注意:

当前主流虚拟机都是可扩展来实现的(通过-Xms和-Xmx来控制),如果堆中没有内存完成实例,并且堆也无法再扩展时,会抛出OutOfMemoryError异常。

五.方法区

方法区的作用是什么?

方法区是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。

为啥说方法区不等价于永久区?

方法区不等价于永久代,只是HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,是为了HotSpot垃圾收集器可以像管理Java堆一样管理这部分内存,能够省去专门为方法区编写内存管理代码的工作,但是这样也会更容易造成内存溢出的问题(永久代可以用-XX:MaxPermSize设置上限),所以在JDK1.7的HotSpot已经把永久代的字符串常量池移出,移到了Java Heap区,可在 《深入解析String#intern》 了解

运行时常量池有什么作用?

运行时常量池也是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分将在类加载后进入方法区的运行时存放。

运行时常量池的特点?

  • Java虚拟机对Class文件每一部分的格式都有严格规定,每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机认可、装载和执行,然而对于运行时常量池却没做任何要求
  • 运行时常量具有动态性,可以在运行期间将新的常量放入池中,比如String的intern()方法

六.直接内存

直接内存是Java虚拟机的内存吗?

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范定义的内存区域,是使用本机的内存,又名堆外内存。

怎么在Java中使用堆外内存?

在JDK1.4中的NIO类,引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,可以使用Native函数库来直接分配堆外内存,然后在Java堆中使用DirectByteBuffer对象来作为这块内存的引用进行操作。

注意:

虽然堆外内存不受Java堆大小的管理,但是受本机总内存以及处理器寻址空间的限制。在服务器管理员配置虚拟机参数的时候,可以通过-Xmx等来配置Java虚拟机最大内存,但经常忽略直接内存,导致各个内存区域总和大于物理内存限制,导致OutOfMemoryError异常。

如果本文有什么疑问或者是错误,欢迎指出留言,互相学习

如果对自己未来有想法,想提升自己,你现在在JAVA这条路上挣扎,也想在IT行业拿高薪,可以参加我们免费的公开课试听学习 干货满满的,选择最适合自己的课程学习,技术大牛亲授,课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来。

群号:468947140

进群修改群备注:开发年限-地区-经验
点击链接加入群聊【Java-BATJ企业级资深架构】:https://jq.qq.com/?_wv=1027&k=52j2FVO

相关文章
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
1224 55
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
432 0
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
714 5
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
573 0
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
381 3
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
278 3
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
1181 6