JAVA 内存区域

SAP_SD模块销售开票计划预收款系统配置及前台操作说明 在 SAP SD 中,开票计划(Billing Plan)是一种允许根据时间节点或里程碑对销售订单进行分期开票的功能。其中最常见的一种应用就是预收款(Down Payment Billing),即在销售订单中直接定义某个百分比或金额作为预收款,系统在开票时自动生成预收账单。大额合同或长期项目型销售(先收 20%,交货前收 30%,交货后收 50%)。分期付款模式(分阶段收款)。必须预收款才能安排生产或交货的业务。后台路径:SPRO—销售与分享—销售—销售凭证—销售凭证项目—定义项目类别。 阅读详情

运行时数据区域

java虚拟机在执行java程序的时候会把它管理的内存分为若干不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。根据java虚拟机规范规定,虚拟机所管理的内存区域包括以下几个区域:
1.程序计数器(线程私有)
 程序计数器是一块较小的内存区域,它是当前线程所执行的字节码的行号指示器,在虚拟机的实现里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等功能都要依赖这个计数器来完成。
 在多处理器计算机中,虚拟机需要处理多个线程同时执行的情况,因此,需要在线程切换回来的时候,仍然需要从上次执行的字节码处继续往下执行。因此,每个线程都需要一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。因此,程序计数器是线程私有的的内存区域。
 如果正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计数器值则为空。此内存区域是唯一一个java虚拟机规范中没有任何规定OutOfMemoryError的情况。
2.java虚拟机栈

1.线程私有,生命周期与线程相同
2.描述了java方法执行的内存模型:每个方法在执行时会创建一个栈帧用户存储局部变量表(8种基本数据类型和引用类型——对象的内存地址)、操作数栈、动态链接、方法出口等信息
3.每一个方法从调用到执行的过程对应着一个栈帧在虚拟机中入栈道出栈的过程
这个区域规定了两种异常情况:如果线程请求的栈深度大于虚拟机所允许的栈深度(Xss,虚拟机默认为1024k),将抛出StackOverFlowError,一般情况是在方法中错误地执行了递归调用
如果虚拟机栈可以动态扩展,当错误地进行了递归调用的时候,会抛出OutOfMemoryError

3.本地方法栈

与虚拟机栈相同,本地方法栈为虚拟机使用到的Native方法服务

4.java堆

1.堆是所有线程共享的java内存区域,用于存放对象实例,几乎所有的对象实例(Object Instant Data以及数组)都在这里分配(随着栈上分配技术、标量替换技术等优化手段的发展,对象也不一定都存储在堆上了)
2.堆是垃圾收集器管理的主要区域。因此很多时候也被称为GC堆。由于现在的收集器基本都采用分代收集算法。所以java堆中还可以细分为:新生代和老年代,再细致一点,可以分为Eden空间,From survivor ,To Survivor空间

3.堆可以是由不连续的物理内存空间组成的,并且既可以固定大小,也可以设置为可扩展的(Scalable),可以通过-Xms 和 Xmx控制,如果堆中没有可用的内存时会抛出OutOfMemoryError异常

5.方法区/常量池

1.方法区是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息(Object Class Data),常量,静态变量,即时编译器编译后的代码等数据
2.虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,正因为方法去存储的数据与堆有一种类比关系,所以还被称为Non-Heap。
3.方法区也可以是内存不连续的区域组成的,并且可设置为固定大小,也可以设置称为可扩展的,这点与堆一样。
4.方法区内部有一个非常重要的区域,叫做运行时常量池(Runtime Constant Pool,简称RCP)。在字节码文件中常量池(Constant Pool Table),用于存储编译器产生的字面量和符号引用。每个字节码文件中的常量池在类被加载后,都会存储到方法区中。值得注意的是,运行时产生的新常量也可以被放入常量池中,比如String类中的intern()方法产生的常量。

6.直接内存区

直接内存区并不是JVM管理的内存区域的一部分,而是其之外。该区域也会在Java开发中使用到,并且存在导致内存溢出的隐患。NIO中是可以使用Native Methods来使用直接内存区的。

对象的创建

对象创建的过程:

1.虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用
2.检查这个符号引用代表的类是否已经被加载,解析和初始化,如果没有就先执行相关类的加载过程
3.类加载检查通过后,虚拟机会为新生对象分配内存。对象所需的内存大小在类加载完成后就可以完全确定,为对象分配内存的任务等同于把一块确定大小的内存从java堆中划分出来
4.内存分配的方法可以分为指针碰撞(假设java堆中的内存是绝对规整的,所有使用过的内存放在一边,空闲的内存放在另外一边,中间放一个指针作为分界点的指示器)和空闲列表(虚拟机维护一个列表来记录哪些内存块是可用的,分配的时候从列表中找到一个足够大的内存划分给对象)两种方式。选择哪种方式由java堆是否规整来决定。
5.虚拟机对对象进行设置:对象是哪个类的实例,如何找到类的元数据信息,对象的hash码,对象的gc分代年龄等信息。这些信息存放在对象头(Object Header)中
6.初始化对象内成员。

对象的内存布局

对象在内存中的布局可以分为三个区域:对象头(Header),实例数据(Instance Data),对齐填充(Padding)

对象头(Header)

 HotSpot虚拟机的对象头包括两部分的信息

第一部分存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳。这部分数据的长度在32位和64位虚拟机中的长度为32bit和64bit
另一部分是类型指针,即对象指向他的类元数据的指针,虚拟机通过这个指针确定这个对象是哪个类的实例。如果Java对象是一个数组,那在对象头中还必须有一块用于记录数组长度的数据。

实例数据(Instance Data)

    真正存储的有效信息。也是程序代码中定义的各种类型的字段内容。无论是从父类继承下来的,还是从子类中定义的,都需要记录起来。

这部分的存储信息会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义的顺序的影响。

对齐填充(Padding)

    对齐填充不是必然存在的,没有特别的含义,仅仅起着占位符的作用。HotSpot要求对象其实地址必须是8的整数倍。对象头部分正好是8字节的倍数,而实例数据部分则不一定,所以这部分需要对齐填充。

对象的访问定位

句柄访问方式:java堆中将划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。
这里写图片描述
指针访问方式:reference变量中直接存储的就是对象的地址,而java堆对象一部分存储了对象实例数据,另外一部分存储了对象类型数据。
这里写图片描述

Qt和FFmpeg的视频压缩工具 m_progressDialog = new QProgressDialog("正在压缩视频...", "取消", 0, 100, parent);QString file = QFileDialog::getOpenFileName(this, "选择视频文件", "",QString file = QFileDialog::getSaveFileName(this, "保存压缩文件", "",QMessageBox::warning(parent, "错误", "请设置输入和输出文件路径"); 阅读详情

相关推荐

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

• 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。GET /items/{id} 详情。,前端同学无需等 Mock 即可联调。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1489

深入理解JVM(一)-理解内存分配

JVM 内存模型 程序计数器: 程序计数器是一块较小内存空间,它可以看做是当前线程所执行的字节码的行号指示器。属于线程私有的 如果线程正在执行的是一个JAVA方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是Native方法,计数器为空,该区域是唯一 不会抛OutOfMemoryError的区域。 说明:Native方法,native方法是指不是用java语言写的方法,

紫殇 341

解决‘GLIBC_2.28 not found‘错误:手把手教你升级glibc到最新版(附中文乱码修复)

本文提供了一份详尽的Linux系统glibc升级实战指南,旨在解决常见的'GLIBC_2.28 not found'错误。文章不仅涵盖从风险评估、环境准备到编译安装的完整流程,还特别加入了精简本地化数据以修复中文乱码的实用技巧,帮助管理员和开发者在安全可控的前提下完成系统核心库的升级。

a1b2c3d的博客 1341

java内存区域浅析

JVM在执行java程序时会将它所管理的内存划分成若干个不同的数据区域。如图所示: 其中方法区和堆是所有线程共享的数据区,其他区域则是线程隔离的数据区。 这些区域的功能各有不同: 程序计数器:可以理解为当前线程所执行的字节码的行号知识器。字节码解释器工作时会通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支,循环,判断,异常处理,线程回复等功能都依赖这个计数

RowandJJ 2492

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1859

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

计算机视觉是一门研究如何使机器从数字图像或视频中提取、分析和理解有用信息的学科。它涉及图像处理、计算机图形学、人工智能等多个领域的知识。通过计算机视觉技术,我们可以实现图像的识别、分类、目标检测等功能。本文介绍了计算机视觉与深度学习的基本概念和原理,并以Python为工具,基于帧间差分法实现了视频目标检测。帧间差分法具有算法实现简单、程序设计复杂度低、对光线等场景变化不太敏感等优点,因此在实际应用中得到了广泛的应用。然而,帧间差分法也存在一些局限性,如对于缓慢移动或静止的物体检测效果不佳。

一个好知识的传播者 1255

Java内存区域

Java内存区域。

yuanmomoya的博客 922

HP MSA 2050磁盘阵列配置步骤

一、盘阵与服务器直接连接 1.1 单控制器配置:一台服务器/ 一个 HBA/ 单路径 1.2 双控制器配置:两台服务器/ 每台服务器一个 HBA/ 双路径 二、通过交换机(一般光纤交换机) 2.1 双控制器配置:两台服务器/ 两台交换机 三、配置MSA2050 3.1在完成硬件安装后,可以访问控制器模块的基于 Web 的管理界面 SMU (存储 管理实用程序),以便监视和管理此存储系统。 首先...

jw5493的博客 1万+

Java内存区域详解

Java 的内存模型定义了线程之间如何共享变量,也决定了线程如何访问和操作内存数据。

error_log7的博客 1188

Win10内网离线安装NET3.5,绝对成功,保姆级

今天工作安装工具软件套装3.5组件!也在csdn上找了很多方法躺了很多坑,我总结如下! 其实就一条,什么版本的win10装什么版本的net3.5 我的电脑是1909版本,用2004H2的镜像是没有用的,dism组件报错8024402C 所以我下载1909镜像挂在虚拟光驱 ,管理员模式下powershell dism.exe /online /enable-feature /featurename:NetFX3 /Source:E:\sources\sxs dism.exe /online /en..

唉呀妈呀脑瓜疼 6万+

AI编码规则:从提示工程到自动化,提升大模型生成代码质量

在软件工程领域,代码质量是保障软件可维护性、安全性和团队协作效率的核心。其背后遵循着从基础语法规范到架构设计原则的一系列工程实践。随着大语言模型(LLM)在代码生成任务中的广泛应用,如何确保AI生成的代码符合这些工程标准,成为一个关键的技术挑战。这涉及到将人类工程师积累的最佳实践,转化为机器可理解、可执行的明确约束。通过系统化的**编码规则**定义与集成,例如构建涵盖安全、风格、架构的多层次规则集,并将其融入**提示工程**或自动化工作流,可以显著引导AI产出更健壮、规范的代码。这种方法的价值在于,它能将模

weixin_42525189的博客 641

Java 内存区域详解

对于Java程序员来说,在虚拟自动内存管理机制下,不再需要像C/C++程序开发程序员这样为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制的权力交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。

rc1596919047的博客 1409

华为od 面试八股文_数据库_01_含答案

华为od 面试八股文_数据库_01_含答案

MISAYAONE的博客 2160

JAVA内存区域

说到Java内存存储区域,很多人第一反应都是“堆栈”。在这之前,我也是这样的人。看完这篇博客后,相信你对Java存储区域、JVM结构都会有一个全新的认识。简单来说,堆是用来存放对象的,而栈是用来执行程序的。 Java虚拟机(JVM)内部定义了程序在运行时需要使用到的内存区域 图中左边棕色部分就是所有线程之间共享的内存区域,而右边蓝色部分则是线程运行时独有的数据区域,从这个分...

Carroll的博客 585

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java内存区域的划分

Java内存区域的划分 Java内存分为线程私有和线程共享 ​ 线程私有: 程序计数器、Java虚拟机栈、本地方法栈 ​ 线程共享: Java堆、方法区 ​ 程序计数器: 是一块较小的内存,可以看作是当前线程所执行的字节码的行号指示器。每条线程都需要一个独立的程序计数器,各个线程之间计数器互不影响。 ​ Java虚拟机栈: Java虚拟机栈也是线程私有,他的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量、操作数、操作数栈、动态链接、方法出

Yyyuu7的博客 495

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怎么理解Java内存区域

基本问题:拓展问题:String类和常量池对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。这些组成部分一些事线程私有的,其他的则是线

TimeFriends 692

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java内存区域划分

Java内存区域 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来 运行数据区域 程序计数器:当前线程所执行的字节码的行号指示器,为线程私有,程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域 Java虚拟机栈:线程私有,生命周期与线程相同。每个java方法运行时都会创建一个栈帧,每个栈帧中会用于存放局部变...

qq_38557194的博客 367

Java的内存区域

TLAB(本地线程分配缓冲): 为每一个线程预先在 Eden 区分配一块儿内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,当对象大于 TLAB 中的剩余内存或 TLAB 的内存已用尽时,再采用上述的 CAS 进行内存分配,是否采用TLAB通过-XX:+/-UseTLAB参数设定。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。直接内存是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的,内存不足报OutofMemory异常。

Swallow_A的博客 292

java的内存区域划分

Java的内存区域划分 简介 在Java编程中,了解内存区域划分是非常重要的一部分。本文将帮助你了解Java的内存区域划分,以及如何实现它。 内存区域划分流程 下面是实现Java的内存区域划分的流程,可以用表格展示步骤: 步骤 描述 1 创建Java虚拟机对象 2 划分内存区域:方法区 3 划分内存区...

weixin_40205106的博客 60

如何理解Java内存区域

导语:在进行Java内存区域讲解之前 我希望大家不要把 Java内存模型和Java内存区域两个知识点搞错了 内存模型不等于内存区域 我们今天要讲解的是Java的内存区域 一.Java为什么要对内存区域进行划分?好处是什么 1.Java与C++那些不得不说的故事? 我们都知道Java是纯面向对象的语言 Java最初的命名其实并不是叫Java 熟悉Java历史的都应该知道 Java之父 詹姆斯.高斯林 最初给Java命名为 C++ - - 为什么叫C++ - - 呢?因为Java的很多设计理念都直接或间接的借鉴

qq_38012000的博客 177

java内存区域

文章目录java内存区域运行时数据区域程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存java对象创建的过程(五步)对象的访问定位的两种方式(句柄和直接指针两种方式) java内存区域 运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都

weixin_46744534的博客 402

Java 内存区域

Java内存区域(运行时数据区域)和内存模型(JMM) Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。 Java运行时内存区域 Java 虚拟机有自动内存管理机制,如果出现内存泄漏和溢出方面的问题,排查错

lihuarui的专栏 378

JAVA内存区域解析

1.虚拟机 虚拟机从软件层面屏蔽了不同操作系统在底层硬件与指令上的区别,java之所以能够跨平台,就是因为虚拟机屏蔽了各个操作系统之间的差异。 不同平台JVM的实现各不相同,所以同样的java代码生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集...

脚步追寻时间 320
上一篇: JVM 内存溢出
下一篇: 引用类型
jamespengo
博客等级 码龄16年 83粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值