JVM笔记:运行时数据区-堆(核心概述)

JVM 运行时数据区的各个组件分别存储什么内容 区域是否线程共享存储内容是否在 JVM 堆中GC 相关堆(Heap)是对象实例、数组、字符串常量池是是(主要 GC 区域)元空间(Metaspace)是类元数据、方法字节码、运行时常量池否(本地内存)类卸载时回收,频率低虚拟机栈否局部变量、方法调用栈帧否方法结束自动释放本地方法栈否native 方法调用信息否同上程序计数器否当前执行指令地址否无。 阅读详情

一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。

  1. 一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域
  2. Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)
  3. 《Java虚拟机规范》规定,堆可以处于==物理上不连续==的内存空间中,但在==逻辑上它应该被视为连续的
  4. 所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的么?不是,TLAB线程在堆中独有的)
  5. 《Java虚拟机规范》中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。
    • 从实际使用的角度看,“几乎”所有的对象的实例都在这里分配内存 (‘几乎’是因为可能存储在栈上)
  6. 数组或对象永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置
  7. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除
  8. 堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域

1.1 配置jvm及查看jvm进程

  • 编写HeapDemo/HeapDemo1代码

    Java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class HeapDemo {
        public static void main(String[] args) {
            System.out.println("start...");
            try {
                Thread.sleep(1000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("end...");
        }
    }
    
  • 首先对虚拟机进行配置,如图 Run-Edit configurations

  • 在jdk目录,我的是/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin下找到jvisualvm 运行(或者直接终端运行jvisualvm),查看进程,可以看到我们设置的配置信息

  • 可以看到HeapDemo配置-Xms10m, 分配的10m被分配给了新生代3m和老年代7m

1.2 分析SimpleHeap的jvm情况

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SimpleHeap {
    private int id;//属性、成员变量
    public SimpleHeap(int id) {
        this.id = id;
    }
    public void show() {
        System.out.println("My ID is " + id);
    }
    public static void main(String[] args) {
        SimpleHeap sl = new SimpleHeap(1);
        SimpleHeap s2 = new SimpleHeap(2);
        int[] arr = new int[10];
        Object[] arr1 = new Object[10];
    }
}

1.3 堆的细分内存结构

  • JDK 7以前: 新生区+养老区+永久区

    • Young Generation Space:又被分为Eden区和Survior区 (Young/New)

    • Tenure generation Space:Old/Tenure

    • Permanent Space: Perm

  • JDK 8以后: 新生区+养老区+元空间

    • Young Generation Space:又被分为Eden区和Survior区 (Young/New)
    • Tenure generation Space: Old/Tenure
    • Meta Space: Meta

MTK眼中6G物理层与无线协议的进化之路 提议统一波束和小区级的测量、报告和切换框架/流程,进一步减少移动性切换过程中的中断,采用可扩展框架/流程,允许在不同移动性场景中进行部分用户设备配置更新以实现快速切换,支持用户设备发起的移动性(同步/切换)以降低延迟和因信令交换导致的失败,设计移动性RS以实现空闲状态下的节能和连接状态下的无缝用户体验,实现5G/6G间的无缝互操作移动性,为固定无线接入(FWA)提供潜在增强,构建统一的跨层移动性框架以降低复杂度、减少中断和失败。为适应多样化的流量类型,需要灵活的帧结构和高层时间对齐。 阅读详情

相关推荐

告别ORB-SLAM2?手把手教你用OpenVSLAM在Ubuntu 20.04上跑通第一个SLAM Demo(含依赖库避坑指南)

本文详细介绍了如何在Ubuntu 20.04系统上从ORB-SLAM2迁移到OpenVSLAM,包括环境配置、依赖库安装、编译调整及性能优化。OpenVSLAM凭借其模块化设计和多相机支持,在SLAM领域展现出显著优势,适合机器人导航和AR应用开发。文章还提供了实用的避坑指南和进阶技巧,帮助开发者高效完成迁移。

weixin_42524499的博客 255

JVM如何运行,揭秘Java虚拟机运行时数据区

介绍Java虚拟机运行时数据区的结构。在运行时数据区中,总的来说分为五个部分。程序计数器,本地方法栈和虚拟机栈是线程私有的,方法区和堆内存是线程共享的。

m0_62946761的博客 3733

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 221

JVM运行时数据区-堆

学习Java运行时数据区中的堆内存,包括堆空间分代思想,内存分配策略,以及逃逸分析等。

m0_62946761的博客 3186

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5464

深度解析【JVM】三大核心架构:运行时数据区、类加载与垃圾回收机制

作为Java生态的基石,Java虚拟机(JVM)承担着字节码解释执行、内存自动管理和跨平台兼容的核心职责。理解JVM工作机制,不仅是解决OutOfMemoryError、StackOverflowError等生产环境问题的关键,更是高级开发者必须掌握的系统级知识。

2301_81073317的博客 4228

【智慧城市】GIS数据获取-获取道路/水路数据

【GIS数据获取】获取道路/水路数据

qq_16599281的博客 4750

JVM运行时数据区——运行时数据区及线程概述

JVM通常会根据运行环境和代码的特性动态地选择解释模式或编译模式。在程序启动时,JVM会使用解释模式来快速启动,然后根据代码的热点(HotSpot)来判断是否进行即时编译

胡晗靓的Java学习博客 702

一文读懂「Chain of Thought,CoT」思维链

Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,对于复杂问题尤其是复杂的数学题大模型很难直接给出正确答案。如算术推理(arithmetic reasoning)、常识推理(commonsense reasoning)、符号推理(symbolic reasoning)。COT通过要求模型在输出最终答案之前,显式输出中间逐步的推理步骤这一方法来增强大模型的算数、常识和推理能力。简单,但有效。2022 年,在 Google 发布的论文。

女王の专属领地 4万+

即插即用系列(代码实践) | WACV 2024 CSAM:面向各向异性医学图像分割的 2.5D 跨切片注意力模块

文章摘要: 论文《CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation》提出了一种解决医学图像各向异性问题的创新模块CSAM。针对MRI/CT数据中切片间分辨率差异大的挑战,该模块通过2.5D跨切片注意力机制,结合2D卷积的轻量性和3D上下文感知能力。核心包括语义注意力(通道级)、位置注意力(空间级)和跨切片注意力(支持不确定性建模),能在几乎不增加参数量的情况下有效捕捉

分享顶会顶刊论文即插即用模块 104

JVM(1)——运行时数据区

本文将带你深入Java虚拟机最核心的运行时数据区(Runtime Data Areas),通过3000字详解+20张图解+实战案例,彻底掌握JVM内存管理的精髓。

2301_80652249的博客 2161

【HYSPLIT 教程第二期】Inline WRF-HYSPLIT 耦合

【HYSPLIT 教程第二期】Inline WRF-HYSPLIT 耦合

WW、forever的博客 809

JVM运行时数据区

想告别内存溢出?揭秘JVM运行时数据区的核心秘密,让你的代码跑得更快更稳!

XiangLinXu的博客 1920

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM运行时数据区深度解析

💡亲爱的技术伙伴们:你是否正被这些问题困扰——我打磨的《 Java高级开发岗面试急救包》正式上线!🎯 特别适合:课程链接:https://edu.youkuaiyun.com/course/detail/40731课程介绍如下:在深入探讨Java虚拟机(JVM)的运行机制之前,我们首先需要了解JVM的核心组成部分之一——运行时数据区。想象一下,一个复杂的软件系统,如大型电子商务平台,它需要处理海量的用户请求,进行数据存储和计算。在这样的系统中,如果JVM的运行时数据区管理不当,可能会导致性能瓶颈甚至系统崩溃。运行时

JavaCodePro的博客 1030

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM虚拟机篇(三):JVM运行时数据区与方法区详解

JVM运行时数据区是JVM在执行Java程序时管理内存的核心区域,它被划分为多个不同的部分,每个部分都有其特定的用途和生命周期。堆(Heap):是JVM中最大的一块内存区域,被所有线程共享。几乎所有的对象实例和数组都在堆上分配内存。堆可以进一步细分为新生代和老年代,新生代又包含伊甸园区(Eden Space)、幸存0区(Survivor 0 Space)和幸存1区(Survivor 1 Space)。

Chenchen0905_的博客 1535

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【jvm系列-04】精通运行时数据区共享区域---堆

精通运行时数据区堆

zhenghuishengq的博客 1万+

【JVM】运行时数据区域

Java 虚拟机在执行 Java 程序时,会将管理的内存划分为若干个不同的数据区域。这些区域有着明确的职责分工,部分区域随线程创建而存在,随线程销毁而消失(线程私有),部分区域则被所有线程共享(线程共享)。值得注意的是,Java 虚拟机规范对这些区域的规定较为宽松。例如,堆可以是连续空间也可以是不连续空间,大小可以固定也可以动态扩展,垃圾回收算法也未做强制要求 —— 这为不同虚拟机实现提供了灵活度,但也要求开发者理解其共性设计。为什么 JDK1.8 移除永久代?永久代大小固定,易引发;

m0_61057201的博客 1514

初识JVM(JVM运行流程,JVM运行时数据区,内存布局中的异常)

JVM是学习Java必要的学习内容,本文就JVM的基本概念以及JVM的运行流程和JVM的运行时数据区展开介绍,介绍了运行时数据区的五个部分:堆区,方法区,虚拟机栈,本地方法栈,程序计数器,最后又说明了内存布局种的异常:堆溢出,栈溢出问题

X_H学Java的博客 2490

JVM运行时数据区详解(13张图助你理解运行时数据区)

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 下图展示了Java虚拟机所管理的内存包括的运行时数据区域:

GuYan的博客 4590

JVM运行时数据区——堆

设置堆内存大小与内存溢出、新生代与老年代、对象分配过程、MinorGC、MajorGC、FullGC、堆空间分代思想、堆中对象的分配策略、为对象分配内存TLAB、堆空间参数设置、逃逸分析

码说芯语的博客 1458

JVM--面试题2:请详细描述 JVM 的运行时数据区

运行时数据区是 JVM 知识体系的核心基石。快速定位内存问题(OOM、栈溢出)合理配置 JVM 参数(堆大小、栈大小、元空间)写出更高效的代码(减少对象创建、避免内存泄漏)“知其然,知其所以然”理解运行时数据区的设计初衷,才能真正掌握 JVM 的精髓。互动话题你在项目中遇到过哪些内存问题?是如何定位和解决的?欢迎在评论区分享你的排查经验!

weisian的博客 1万+

深入解析JVM运行时数据区

JVM是Java程序运行的核心环境,它通过加载.class文件、执行字节码并将代码翻译成机器指令来实现Java程序的跨平台运行。JVM内存区域包括方法区、堆、虚拟机栈、本地方法栈和程序计数器,其中堆和方法区是线程共享的,其他区域是线程私有的。Java堆是对象实例的主要存储区域,采用分代设计(新生代和老年代)进行垃圾回收。方法区存储类信息、常量等数据,JDK1.8后由元空间实现。JVM通过程序计数器记录线程执行位置,通过动态内存分配和垃圾回收机制管理内存。

2501_93873871的博客 828

JVM—运行时数据区

本文介绍了JVM的运行时数据区,包括堆、虚拟机栈、本地方法栈、程序计数器等,并介绍了它们的特点和需要注意的事项。

随机的未知——用已知去面对未知 1322

JVM规范之运行时数据区域

本文基于JVM8规范,介绍了JVM运行时数据区的组成及其功能。JVM运行时数据区分为线程私有和线程共享两类。线程私有的数据区包括程序计数器(PC Register)、Java虚拟机栈(JVM Stack)和本地方法栈(Native Method Stack);线程共享的数据区包括堆(Heap)、方法区(Method Area)和运行时常量池(Run-time Constant Pool)。

Erictr的博客 1304

Java 运行时数据区详解

本文主要介绍了Java运行时数据区相关内容,包括程序计数器、Java虚拟机栈、本地方法栈、堆、方法区等内容。

专注Java和MySQL领域知识分享 1991
上一篇: JVM笔记:运行时数据区-方法区(方法区的垃圾回收)
下一篇: JVM笔记:运行时数据区-堆(设置堆内存大小与OOM)
java面试官
博客等级 码龄5年 1986粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java面试官

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值