网站首页 > 精选教程 正文
代码如诗,你我皆为诗人。大家好,我是水哥,一个在软件开发领域深耕多年的资深工程师。
今天水哥想聊聊 JVM 的内存结构。
JVM 内存结构是指 JVM 运行 Java 程序时候的数据区(Run-Time Data Areas)的结构,主要有几个部分:
程序计数器(Program Counter 简称 PC)
JVM 可以同时支持多个线程的执行。每个 JVM 线程都有自己的程序计数器(pc)。pc 包含当前正在执行的 JVM 指令的地址。
栈(Stack)
每个 JVM 线程都有自己的私有 JVM 栈,这个栈在线程创建时同时创建。JVM栈存储栈帧(frames)。栈保存局部变量和部分结果,并在方法调用和返回时发挥作用。
如果线程需要栈的空间超过栈的容量,JVM 将抛出我们耳熟能详的报错 StackOverflowError。
如果 JVM 无法动态扩展栈空间,或者,如果无法获得足够的内存来为新线程创建初始栈,JVM 将抛出另一个我们耳熟能详的报错 OutOfMemoryError。
我们可以根据应用的特定需求,通过修改 JVM 启动参数调整栈的大小,包括初始值、最小值、最大值。
堆(Heap)
JVM 拥有一个所有 JVM 线程共享的堆。堆是分配所有类实例和数组内存的地方。堆在虚拟机启动时被创建。对象的堆存储由垃圾收集器(GC)回收;对象永远不会被显式地释放。
如果无法提供足够的内存来满足计算所需的更多堆内存,JVM 将抛出 OutOfMemoryError。
我们可以根据应用的特定需求,通过修改 JVM 启动参数调整堆的大小,包括初始值、最小值、最大值。
方法区(Method Area)
JVM 拥有一个所有 JVM 线程共享的方法区。方法区存储每个类的结构,如运行时常量池、字段和方法数据,以及用于类和接口初始化及实例初始化的特殊方法的代码。
方法区在虚拟机启动时被创建。尽管方法区在逻辑上是堆的一部分,但简单的实现可能会选择不对方法区进行垃圾回收或压缩。
如果无法在方法区中获得内存以满足分配请求,JVM 将抛出 OutOfMemoryError。
我们可以根据应用的特定需求,通过修改 JVM 启动参数调整方法区的大小,包括初始值、最小值、最大值。
常量池(Constant Pool)
运行时常量池是每个类或接口在运行时对类文件中的常量池表的表示。它包含了几种常量,从在编译时已知的数值字面量到必须在运行时解析的方法和字段引用。运行时常量池的作用类似于传统编程语言的符号表,尽管它包含比典型符号表更广泛的数据范围。
每个运行时常量池都从 JVM 的方法区中分配。类或接口的运行时常量池在类或接口被 JVM 创建时构建。
当创建类或接口时,如果运行时常量池的构建需要的内存超过了 JVM 方法区中可用的内存,JVM 将抛出 OutOfMemoryError。
本地方法栈(Native Method Stack)
JVM 的实现可能使用传统的栈,俗称为"C stack",以支持本地方法的执行(即用 Java 编程语言之外的语言编写的方法)。本地方法栈也可能被 JVM 指令集的解释器实现所使用,这通常用 C 语言编写。如果JVM实现不能加载本地方法,并且其本身不依赖于传统的栈,则不需要提供本地方法栈。如果提供了本地方法栈,它们通常在每个线程创建时为每个线程分配。
如果线程的计算需要的本地方法栈大小超过了允许的大小,则 JVM 将抛出 StackOverflowError。
如果本地方法栈无法获得足够的内存来实现扩展,或者,如果无法获得足够的内存来为新线程创建初始本地方法栈,则 JVM 将抛出 OutOfMemoryError。
我们可以根据应用的特定需求,通过修改 JVM 启动参数调整本地方法栈的大小,包括初始值、最小值、最大值。
今天水哥主要讲了 JVM 的内存结构,下次我会讲下 JVM 的内存管理,请继续关注~
如果您在技术探索的旅途中偶遇了这篇文章,水哥感到十分荣幸。感谢您抽出宝贵时间阅读至此。
若您觉得有所收获,不妨点赞、分享,让更多人一同受益。您的支持是我前进的动力。
想了解精粹的软件开发技术、前沿的云计算实践、高效的敏捷管理策略,敬请关注我的公众号(码农水哥:manongshuige),一起探索技术深度,享受敏捷之美。
- 上一篇: JVM的内存结构详解
- 下一篇: 一篇文章带你了解Java内存分布,爸妈再也不用担心啦
猜你喜欢
- 2024-11-18 jvm之内存结构
- 2024-11-18 Java内存模型(JMM)详解
- 2024-11-18 Java8堆内存结构、组成部分、工作原理以及如何影响程序的性能。
- 2024-11-18 jvm内存结构java内存模型,对象布局还分不清?快来围观
- 2024-11-18 你需要知道的jvm系列:JVM内存结构
- 2024-11-18 Java进程内存结构深度剖析!
- 2024-11-18 程序员面试干货|一文讲清JVM内存结构
- 2024-11-18 一篇文章带你了解Java内存分布,爸妈再也不用担心啦
- 2024-11-18 JVM的内存结构详解
- 2024-11-18 JVM内存模型和结构详解(五大模型图解)
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)