【Java】JVM学习(三)

news2025/1/9 15:07:48

JVM的整体内存结构

本地方法栈

本地方法栈跟 Java 虚拟机栈的功能类似,Java 虚拟机栈用于管理 Java 函数的调用,而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的,而是由 C 语言实现的(比如Object.hashcode方法)。

本地方法栈是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。你甚至可以认为虚拟机栈和本地方法栈是同一个区域。

虚拟机规范无强制规定,各版本虚拟机自由实现 ,HotSpot直接把本地方法栈和虚拟机栈合二为一 。

方法区

方法区(Method Area)是可供各条线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法

方法区是JVM对内存的“逻辑划分”,在JDK1.7及之前很多开发者都习惯将方法区称为“永久代”,是因为在HotSpot 虚拟机中,设计人员使用了永久代来实现了 JVM 规范的方法区。在JDK1.8及以后使用了元空间来实现方法区。

在这里插入图片描述

元空间

方法区与堆空间类似,也是一个共享内存区,所以方法区是线程共享的。假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有装入 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。

在 HotSpot 虚拟机、Java7 版本中已经将永久代的静态变量和运行时常量池转移到了堆中,其余部分则存储在 JVM 的非堆内存中,而 Java8 版本已经将方法区中实现的永久代去掉了,并用元空间(class metadata)代替了之前的永久代,并且元空间的存储位置是本地内存。

Java8 为什么使用元空间替代永久代,这样做有什么好处呢?

官方给出的解释是:
移除永久代是为了融合 HotSpot JVM 与 JRockit VM 而做出的努力,因为 JRockit 没有永久代,所以不需要配置永久代。

永久代内存经常不够用或发生内存溢出,抛出异常 java.lang.OutOfMemoryError: PermGen。这是因为在 JDK1.7 版本中,指定的 PermGen 区大小为 8M,由于 PermGen 中类的元数据信息在每次 FullGC 的时候都可能被收集,回收率都偏低,成绩很难令人满意;还有为 PermGen 分配多大的空间很难确定,PermSize 的大小依赖于很多因素,比如,JVM 加载的 class 总数、常量池的大小和方法的大小等。

运行时常量池

运行时常量池(Runtime Constant Pool)是每一个类或接口的常量池(Constant_Pool)的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。

运行时常量池是方法区的一部分。运行时常量池相对于Class常量池的另外一个重要特征是具备动态性。

堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。

堆空间一般是程序启动时,就申请了,但是并不一定会全部使用。堆一般设置成可伸缩的。

随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收。这个在 Java 中,就叫作 GC(Garbage Collection)。

那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。

Java 的对象可以分为基本数据类型和普通对象。

对于普通对象来说,JVM 会首先在堆上创建对象,然后在其他地方使用的其实是它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。

对于基本数据类型来说(byte、short、int、long、float、double、char),有两种情况。
当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,都是在堆上分配。

直接内存(堆外内存)

直接内存有一种更加科学的叫法,堆外内存。

JVM 在运行时,会从操作系统申请大块的堆内存,进行数据的存储;同时还有虚拟机栈、本地方法栈和程序计数器,这块称之为栈区。操作系统剩余的内存也就是堆外内存。

它不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域;如果使用了NIO,这块区域会被频繁使用,在java堆内可以用directByteBuffer对象直接引用并操作;

这块内存不受java堆大小限制,但受本机总内存的限制,可以通过-XX:MaxDirectMemorySize来设置(默认与堆内存最大值一样),所以也会出现OOM异常。

JVM运行内存的整体流程

JVM在操作系统上启动,申请内存,先进行运行时数据区的初始化,然后把类加载到方法区,最后执行方法。

方法的执行和退出过程在内存上的体现上就是虚拟机栈中栈帧的入栈和出栈。

同时在方法的执行过程中创建的对象一般情况下都是放在堆中,最后堆中的对象也是需要进行垃圾回收清理的。

堆空间分代划分

堆被划分为新生代老年代(Tenured),新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成。

在这里插入图片描述

GC

JVM(Java虚拟机)中的垃圾回收(Garbage Collection,GC)是一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占用的内存空间。垃圾回收器负责识别和回收那些无效或不可访问的对象,并将它们占据的内存重新分配给其他需要的对象。

内存溢出

当JVM运行时出现内存溢出(Out of Memory)时,通常可以细分为以下几种类型:堆溢出、栈溢出、方法区溢出和本机直接内存溢出。

堆溢出(Heap Overflow):
堆是JVM中用于存储对象实例的内存区域。当创建的对象数量超过堆的容量,或者无法为新的对象分配内存空间时,就会发生堆溢出。堆溢出常见的原因是内存泄漏(Memory Leak),即大量无用的对象被持续引用,无法被垃圾回收器回收。

栈溢出(Stack Overflow):
栈是JVM中用于保存方法调用和局部变量的内存区域。每个线程都会有自己的栈,用于存储方法调用的状态。当递归调用或方法调用层级过深时,栈的大小会超过其容量,导致栈溢出。栈溢出可能是因为无限递归,或者某个方法持续调用自身而没有终止条件。

方法区溢出(Method Area Overflow):
方法区是JVM中用于存储类信息、常量、静态变量以及编译器优化后的代码等数据的内存区域。当加载的类过多或者常量池中的常量数量超出方法区的限制,就可能导致方法区溢出。此外,动态生成类过多,也有可能引发方法区溢出。

本机直接内存溢出(Direct Memory Overflow):
本机直接内存是JVM使用的一块与堆内存分离的直接内存区域。通过NIO使用直接缓冲区时,会使用本机直接内存。如果不断分配本机直接内存而没有回收,在达到操作系统对直接内存的限制后,就会发生本机直接内存溢出错误。

当发生这些溢出问题时,通常会抛出相应的异常,例如:OutOfMemoryError、StackOverflowError等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCA(主成分分析)

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。数据降维是无监督学习的另外一个常见问题。 数据的向量表示及降维问题 …

PostgreSQL 如何对索引进行分析和处理

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

智慧煤矿4G物联网方案,矿山矿井远程监控管理4G网关应用

随着经济发展煤矿需求不断激增,矿山矿井普遍处于偏远山区,生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题,利用网关对现场终端设备连接组网,实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛,户外环境…

《Opencv3编程入门》学习笔记—第八章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第八章 图像轮廓与图像分割修复 一、查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线,其表示方法可能根据不同的情况而有所不…

FFmpeg 播放器实现音视频同步的几种方式

我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染,本文将实现播放器的最后一个重要功能:音视频同步。 老人们经常说,播放器对音频和视频的播放没有绝对的静态的同步,只有相对的动态的同步&#…

深度学习管理工具

1. mlflow https://zhuanlan.zhihu.com/p/363673389 官方文档: https://www.mlflow.org/docs/latest/index.html https://zhuanlan.zhihu.com/p/67173051 在跟踪实验时,通过运行 mlflow ui 后在 http:// localhost:5000 中进行…

ranger,hive,hdfs的三者的权限管理

ranger,hive,hdfs的三者的权限管理 情况一:连接datagrip 用户在hdfs上的权限 可以看出只给了用户write权限,尝试登录xwq用户,在datagrip上登录成功 经过实验验证:要想使用datagrip或者hive-cli登录hive…

C++11【一】

文章目录 一、C11简介二、右值引用三、可变参数模板四、 empacle_back(移动构造/赋值)五、简单特性 一、C11简介 C11是C编程语言的一个版本,于2011年发布。C11引入了很多新特性,比如:类型推导(auto关键字)、Lambda表达式、线程库、列表初始化…

电源浪涌保护器加装后备保护器的作用

随着现代化技术的发展,信息化系统集成度越来越高。设备敏感度高,抗冲击能力低,极易受到电涌脉冲的危害。电涌保护器(SPD)作为专业的防电涌产品,应用越来越广,SPD的应用涉及很多的专业知识&#…

孩子创新思维秘籍

头脑风暴最重要的原则之一就七个字, 要数量,不要质量。 意思就是说,你尽可能的去胡思乱想,胡说八道,天马行空就对了。 我们从这一大堆古灵精怪的玩意儿里面去筛选那些真正有价值的东西,可以拓展的方案。 然…

【技术选型】Redis的几种集群方案、及优缺点对比

文章目录 背景一、主从模式二、哨兵模式三、Redis Cluster四、各大厂的Redis集群方案客户端分片代理分片Codis 五、Redis集群方案解决方案六、Redis集群方案原理总结 背景 在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上&#xff0…

GCP学习笔记(二)——大数据和机器学习

文章目录 一、数据读取和处理1.Pub/Sub代码实践PublishingSubscribing 2. Dataflow使用Python搭建Pipeline 3. Dataproc4. Cloud Data Fusion5. 其他工具Cloud Composer (Apache Airflow)Cloud Scheduler 二、可视化与分析1. Looker2. Looker Studio3. B…

【数据结构与算法C++实现】2、二分查找与简单递归

原视频为左程云的B站教学 文章目录 1 二分法1.1 在有序数组中查找特定元素1.2 在一个有序数组中查找>某个数的最左侧的位置1.3 在一个有序数组中查找<某个数最右侧位置1.4 局部最小值问题&#xff08;无序数组使用二分法的案例&#xff09; 2 简单的递归思想 1 二分法 …

在AI热潮中,过早的卖掉Datadog股票是个非常错误的决定

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Datadog股价 Datadog&#xff08;DDOG&#xff09;目前的股价比其历史高点低了50%左右&#xff0c;比近期低点高了50%左右。 猛兽财经上次关注Datadog是在4月份&#xff0c;当时由于该股的增长前景已经恶化&#xff0c;所以…

windows电脑hbuilderx打包iOS app及上架app store教程

ios应用&#xff0c;无法像安卓应用一样&#xff0c;上传到自己的服务器让互联网用户下载进行安装&#xff0c;所以需要将生成的app上传到app store&#xff0c;然后用户到app store安装app。 由于官网的教程是使用mac电脑生成证书和上架的&#xff0c;但是很多使用hbuilderx打…

实践指南 | 风控引擎快速接入不同数据源的操作说明

随着互联网垂直电商、消费金融等领域的快速崛起&#xff0c;用户及互联网、金融平台受到欺诈的风险也急剧增加。网络黑灰产已形成完整的、成熟的产业链&#xff0c;每年千亿级别的投入规模&#xff0c;超过1000万的“从业者”&#xff0c;其专业度也高于大多数技术人员&#xf…

Templates 虽然工具将近被淘汰,但依然会有一些场景会被使用-eclipse 格式化注释

Templates 是一款-eclipse 格式化注释模板。虽然工具将近被淘汰&#xff0c;但依然会有一些场景会被使用&#xff0c;今天就来分享一下自己用过的一款&#xff0c;已经去掉不常用的&#xff0c;保留必要的模板内容。 设置方法如下&#xff1a; 设置Code Templates&#xff0c…

Java-定时任务

文章目录 补充&#xff1a;cron表达式基本知识方式一&#xff1a;使用sleep方法方式二&#xff1a;JDK Timer和TimerTask方式三&#xff1a;JDK ScheduledExecutorService方式四&#xff1a; Spring Task 中 的 Scheduler方法五、Quartz框架方式六&#xff1a;XXL-JOB将xxl-job…

canvas实现简易画板

效果图如下&#xff1a; 实现功能&#xff1a; 1、改变画笔粗细 2、保存签名实现下载功能 3、使用橡皮擦功能 4、清空画布 5、改变画笔颜色 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta …

ChatGPT新功能曝光:可记住用户信息、上传文件和工作区

&#x1f989; AI新闻 &#x1f680; ChatGPT新功能曝光&#xff1a;可记住用户信息、上传文件和工作区 摘要&#xff1a;一张神秘截图曝光了ChatGPT新功能&#xff0c;包括可记住用户信息的"My profile"、上传和管理文件的"My files"以及可以让AI使用不…