说一下 jvm 运行时数据区?

轻杰姑娘_2680

轻杰姑娘_2680

2025-09-22

959人浏览

原创

jvm运行时数据区分为线程私有和共享区域:程序计数器记录字节码地址,是唯一不发生oom的区域;虚拟机栈存储方法执行信息,可能抛出stackoverflowerror或outofmemoryerror;本地方法栈服务native方法;java堆为对象实例分配空间,是gc主要区域,内存不足抛出oom;方法区存储类信息、常量等,jdk8后元空间替代永久代;运行时常量池属方法区,支持动态添加常量;直接内存通过nio使用,不受堆限制但受本地内存限制。

说一下 jvm 运行时数据区?

JVM 运行时数据区是 Java 虚拟机在执行 Java 程序时管理内存的区域划分。这些区域各自承担不同的职责,协同完成程序的运行。主要分为线程私有和线程共享两大部分。

线程私有区域

这些区域随线程创建而创建,随线程销毁而销毁,每个线程独有。

  • 程序计数器(Program Counter Register):记录当前线程所执行的字节码指令的地址。如果执行的是 Java 方法,计数器保存的是正在执行的虚拟机字节码指令的地址;如果是本地方法,则计数器值为 undefined。这个区域是唯一不会发生 OutOfMemoryError 的区域。
  • Java 虚拟机栈(Java Virtual Machine Stacks):每个线程私有的栈,描述 Java 方法执行的内存模型。每次方法调用都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法返回地址等信息。栈的大小可以是固定或动态扩展,若线程请求的栈深度大于虚拟机允许的最大深度,会抛出 StackOverflowError;若无法申请足够内存,会抛出 OutOfMemoryError。
  • 本地方法栈(Native Method Stack):与虚拟机栈类似,但服务的是本地(native)方法。有些 JVM 实现(如 HotSpot)将两者合二为一。

线程共享区域

这些区域被所有线程共享,随虚拟机启动而创建,随虚拟机退出而销毁。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • Java 堆(Java Heap):所有线程共享的一块区域,用于存放对象实例和数组。它是垃圾回收的主要区域,通常也被称为“GC 堆”。堆可以是物理上不连续的空间,只要逻辑上连续即可。堆内存不足时会抛出 OutOfMemoryError。
  • 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。在 JDK 8 之前,使用永久代(Permanent Generation)实现;JDK 8 及以后,用元空间(Metaspace)替代,元空间使用本地内存(Native Memory),避免了永久代常见的内存溢出问题。
  • 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。这部分内容会在类加载后进入方法区的运行时常量池。它具备动态性,可以在运行期间添加新的常量,比如调用 String 的 intern() 方法。

直接内存(Direct Memory)

虽然不属于 JVM 运行时数据区的规范部分,但经常被使用。通过 NIO 中的 ByteBuffer.allocateDirect() 分配的内存就是直接内存,它位于本地内存中,不受 Java 堆大小限制,但受本机总内存限制。频繁使用可能导致本地内存溢出(OutOfMemoryError)。

基本上就这些。理解这些区域有助于排查内存问题,比如栈溢出、堆溢出、元空间溢出等,也能更好掌握 GC 和性能调优的原理。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java 字节 虚拟机 overflow

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java I/O 与 NIO 编程体系合集
Java I/O 与 NIO 编程体系合集

全面讲解 Java I/O 编程的演进与核心 API,涵盖传统 I/O 的字节流(InputStream/OutputStream)与字符流(Reader/Writer)体系、装饰器模式在 I/O 中的应用(BufferedReader/InputStreamReader)、文件读写与目录操作、NIO 核心三要素(Buffer 缓冲区/Channel 通道/Selector 选择器)、ByteBuffer 操作与内存映射文件(Mappe

2026.04.29

312

28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

4999

3

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

5684

49

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

4427

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2048

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

4427

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2048

6

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3398

6

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11105

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程