干货分享丨Java开发稳步进阶之JVM内存区域,看完记得收藏!

2023-11-07

Java语言最重要的特点之一:跨平台使用,正是由于JVM的存在。想要Java开发稳步进阶,学JVM这条路绕不开。

1.为什么要学JVM?

我们都知道,要做Java开发,必须在你的电脑上安装JDK才行,安装JDK之后里面会有一个JRE的目录,JRE提供了软件环境----JVM。

在开发过程中当我们出现内存泄漏、内存溢出的时候我们不应该想到-Xms去设置或者栈的-Xss或者restart来解决,而是更应该去想想,为什么会出现?什么导致?怎么优化?

2.JVM是什么?

JVM,即Java Virtual Machine ,Java虚拟机 运行在操作系统之上的虚拟的计算机 。我们主要研究的是 HotSpot VM JDK自带的虚拟机,这个虚拟机有两个很好的优点:准确式GC + 热点代码探测技术。所谓准确式GC,就是让JVM知道内存中某位置数据的类型什么。比如当前内存位置中的数据究竟是一个整型变量还是一个引用类型。这样JVM可以很快确定所有引用类型的位置,从而更有针对性的进行GC roots枚举。JVM进行一段代码是不是热点代码,是不是需要触发即时编译,这样的行为称为热点探测。Java语言最重要的特点之一:跨平台使用,正是由于JVM的存在。

3.JVM虚拟机内存结构

JVM虚拟机将其内存分为程序计数器、虚拟机栈、本地方法栈、java堆、方法区。


我们看看上面图片,当文件被加载之后,会变成一个JVM进程 而字节码文件就运行在JVM进程内。开启一个线程就独占一块内存区域, 彼此独立。分区只考虑线程安全问题,线程共享不安全,存在线程对于资源得争夺。

4.你真正了解方法区吗?

方法区实际上是属于共享内存区域,Java源文件反映的信息都叫类信息,Java源文件会被编译成二进制文件加载到JVM去执行。比如:要去拿类对象,通过Student.class,类对象存在方法区,实际上拿到的是方法区的引用。

这里多提一点,方法区也存在垃圾回收,但是回收率低,回收主要针对常量池的回收,和类型卸载。当方法区无法满足内存需求时,会报OOM。

在共享区画堆内存,这个大家比较了解了:
Student stu = new Student();
new 出来得对象存在堆里面,stu是存在栈里面,这里提到的堆就是堆区。

对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。

试想,堆中存储了对象,到底存的是什么?Java对象在内存中的布局?

先运行int num = 1; 不会存num的名称,而是存1。然后是存 marsLee,不是名称,而是引用堆区的地址。

元信息保存在方法区,元信息(模板)在堆区都有实例存储。静态变量和方法都存在方法区。存储对象只是存储实例对象的值,名称不会存。

那对象怎么鉴定呢?通过对象头object header,包含Mark Word(标记字段)和 Klass Pointer(类型指针)

✅Klass Pointer,即是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

✅Mark Word,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等。

5.知识点总结

对象放堆区,线程安不安全?不安全。
多个线程操作一个对象就会不安全,除非只读。
当多个线程访问Student对象时 ,这个静态字段会不会安全?不安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

干货分享丨Java开发稳步进阶之JVM内存区域,看完记得收藏! 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐

  • Linux上搭建Jenkins

    Linux上搭建Jenkins 下面给出Linux上搭建Jenkins的环境 教你一步步搭建起来 1 Jenkins下载 Jenkins 下载网址 Download Jenkins Jenkins 最新版本 jenkins 1 514 al
  • ARM平台基于嵌入式Linux使用MIPI CSI-2接口

    标签 ARM Linux MIPI Camera NXP nVidia Toardex Apalis By Toradex 秦海 http www eefocus com toradex blog 16 05 384885 f19b5 ht
  • 最近学到的一些前端知识

    在Vue中使用v for不仅可以遍历数组 还可以遍历对象 当然也可以遍历字符串 还有在Vue中 不可以深度监听数组的变化 比如将数组arr某一项的值改变 在视图上不会发生变化 在网上找了很多方法 包括Vue set 原对象 位置 值 以及v
  • 文件上传漏洞upload-libs pass2

    文件上传漏洞upload libs pass2 首先查看源码 发现是后端PHP过滤 仅允许类型为image jpeg image png image gif的文件上传 将一句话木马的后缀改为jpg 上传图片并抓包 Send to Repea
  • 浅谈CUDA零拷贝内存

    今天看到有小伙伴提出了 零拷贝 的问题 由于本人以前用的也比较少 了解不多 因此打算好好研究一番 现做些总结 零拷贝内存是一种特殊形式的内存映射 它允许你将主机内存直接映射到GPU内存空间 因此 因此对GPU上的内存解引用时 如果是基于GP
  • word2010 数学公式/联立方程/大括号内方程组如何左对齐?

    如何在word中输入的联立方程使其条件左对齐 如输入 实现如下对齐 就是在每个逗号 前输入一个 号就可以了 注意这个逗号一定要是
  • cookie的path值的默认规则

    在项目中有时需要用cookie来保存用户信息 不论是在js代码还是java代码中 很多时候我们都只设置了cookie的name value和maxAge 而没有去管path 例如下面的 代码块1 是当一个用户首次访问网站的时候添加一个coo
  • PCL点云库学习笔记(可视化2)

    PCL点云库学习笔记 可视化 可视化 四 PCLPlotter 五 MFC 开发实例 可视化 四 PCLPlotter 4 1 绘制多项式 PCLPlotter提供了一个非常简单明了的图形绘制界面 可以在库中可视化各种重要的图 从多项式函数
  • 安克创新与亚马逊云科技成立联合创新实验室

    日前 全球化消费电子品牌企业安克创新 Anker 正式同亚马逊云科技成立联合创新实验室 在采用亚马逊云科技服务的基础上 推动安克创新将数据分析 机器学习等服务进行规模化应用 赋能业务创新 目前 双方通过联合创新实验室在智能广告投放等领域展开
  • Java Precondition类

    Public final class Preconditions extends Object 通过Precondition类 你可以声明你期望为真的表达式 就像在JUnit assertTrue调用时的断言 注意 在errorMessag
  • git rebase -i

    git rebase i 是一种交互式的 rebase 方式 其中 i 是 interactive 的简写 这种方式允许你修改一系列的 commit 信息 在 rebase 过程中有选择地选择 编辑或者合并 commit 在执行 git r
  • 剑指Offer—— 最小的K个数

    题目描述 输入n个整数 找出其中最小的K个数 例如输入4 5 1 6 2 7 3 8这8个数字 则最小的4个数字是1 2 3 4 第一种方法是全排序 先把数组进行排序 排序后依次输出最小的4个 时间复杂度为nlogn 第二种方法是的原理和快
  • MES是什么?有什么作用?

    近年来 随着JIT Just In Time BTO 面向订单生产 等新型生产模式的提出 以及客户 市场对产品质量提出更高要求 MES逐渐被发现重视 同时在网络经济泡沫的破碎后 企业开始认识到要从最基础的生产管理上提升竞争力 即只有将数据信
  • php工作量,区块链扫盲篇之使用PHP实现区块链(二) - 工作量证明

    1 前言 上一篇文章我们介绍了区块链的最基本数据结构 区块 而且还构建了一个最原始的区块链 但是现在我们很容易就可以向区块链中添加区块 这样有可能导致大量的区块在同时添加到区块链中 从而导致广播风暴 而且在分布式环境中 如果并发量太大会导致
  • 【测评】PaMu Unique真无线蓝牙耳机,国潮新时尚,年轻人的标配

    本文作者为体验师 喝酸奶舔盖斯基 首发于糖纸众测 目 录 测评信息 外观设计 通话降噪 CD音质 续航持久 佩戴舒适 测评信息 产品名称 神偷奶爸小黄人系列真无线蓝牙耳机 设备型号 T6D 辅测设备 荣耀MagicBook笔记本 小米8手机
  • Unity协程和线程的区别深入理解(附实验展示)

    Unity协程和线程的区别附实验展示 写在前面 协程 进程 线程的概念 进程与线程的区别 协程与线程的区别 实验1 协程中执行普通函数 实验2 协程中开启另一个协程 实验3 协程中开启WWW请求 实验4 一个脚本中多个协程访问临界资源 实验
  • grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现

    参考文章 https www alanzucconi com 2020 09 14 inverse kinematics in 3d 上一篇 grbl控制3轴机械臂 原理 实现 一 之2D机械臂模拟及实现 3轴机械臂几何分析 到目前为止 我
  • 应用于电力计能表的RFID仓储管理系统

    1 应用背景 电力计量中心是电力行业的电能计量检测机构 承担辖区内电能计量器具安全生命周期管理的职能 包括采购 仓储 检测 配送 安装 运行监测等各个环节 随着城网改造和居民一户一表工作的深入进行 电力新装用表数量急剧增加 传统的计量中心难
  • 夏普SHARP AR-2818 一体机驱动

    夏普SHARP AR 2818 一体机驱动是官方提供的一款一体机 打印 扫描 驱动 本站收集提供高速下载 用于解决一体机与电脑连接不了 无法正常使用的问题 本动适用于 Windows XP Windows 7 Windows 8 Windo
  • 干货分享丨Java开发稳步进阶之JVM内存区域,看完记得收藏!

    Java语言最重要的特点之一 跨平台使用 正是由于JVM的存在 想要Java开发稳步进阶 学JVM这条路绕不开 1 为什么要学JVM 我们都知道 要做Java开发 必须在你的电脑上安装JDK才行 安装JDK之后里面会有一个JRE的目录 JR