JVM-Java内存区域

news2024/9/27 19:15:16

1、运行时数据区域
运行时数据区域:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。
非运行时数据区域:直接内存。
(1)程序计数器
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。在多线程的情况下,记录当前线程执行的位置。
生命周期随着线程的创建而创建,随着线程的结束而死亡。
程序计数器是唯一一个不会出现OutOfMemoryError的内存区域。
注:1)Java编译器,将Java源文件(.java文件)编译成字节码文件(.class文件,二进制文件),即javac.exe。2)Java解释器,JVM的一部分,Java解释器用来解释执行Java编译器编译后的程序,即java.exe。
(2)Java虚拟机栈
JVM运行时数据区域的一个核心,由栈帧组成。
方法调用的数据通过栈进行传递,每一次方法调用都会有一个栈帧被压入栈中,方法调用结束后栈帧被弹出。
生命周期随着线程的创建而创建,随着线程的结束而死亡。
栈帧随着方法调用而创建,随着方法结束而销毁。
服务于虚拟机执行的Java方法(也就是字节码)。
若栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就抛出StackOverFlowError错误。
如果栈的内存大小可以动态扩展,如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
(3)本地方法栈
与Java虚拟机栈不同的是,它服务于虚拟机使用到的Native方法。
(4)堆
Java虚拟机所管理的内存中最大的一块。
存放对象实例。
Java堆是垃圾收集器管理的主要区域,因此也被称作GC堆。
Java堆被划分为新生代、老年代和永久代,新生代又被划分为Eden区和两个Survivor区(S0、S1)。大部分情况,对象都会首先在Eden区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入Survivor区,并且对象的年龄还会加1(Eden区到Survivor区后对象的初始年龄变为1),对象在Survivor中每熬过一次垃圾回收,年龄就增加1岁,当它的年龄增加到一定程度(默认晋升年龄并不都是15,这个是要区分垃圾收集器的),就会被晋升到老年代中。老年代存放一些生命周期较长的对象(像新生代晋升过来的)或者较大对象。JDK8版本之后永久代已被元空间取代,元空间使用的是直接内存。
当JVM花太多时间执行垃圾回收并且只能回收很少的堆空间时,就会发生java.lang.OutOfMemoryError: GC Overhead Limit Exceeded错误。
假如在创建新的对象时,堆内存中的空间不足以存放新创建的对象,就会发生java.lang.OutOfMemoryError: Java heap space错误。
对象晋升到老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold来设置。


(5)方法区
存储已被虚拟机加载的类信息、字段信息、方法信息等(例如名称、修饰符等),即编译器编译后的代码缓存等数据。
在不同的虚拟机,方法区的实现是不同的。永久代和元空间是方法区的两种实现方式。
整个永久代有一个JVM本身设置的固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制。
当元空间溢出时会得到如下错误java.lang.OutOfMemoryError: MetaSpace。
可以使用-XX:MaxMetaspaceSize标志设置最大元空间大小,默认值为unlimited。-XX:MetaspaceSize调整标志定义元空间的初始大小,如果未指定此标志,则Metaspace将根据运行时的应用程序需求动态地重新调整大小。
(6)直接内存
堆外内存或系统内存。
2、HotSpot虚拟机对象的创建
(1)类加载检查
(2)分配内存
分配方式有指针碰撞和空闲列表两种。
指针碰撞适用场合,堆内存规整的情况下。用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。


空闲列表适用场合,堆内存不规整的情况下。虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块儿足够大的内存块儿来划分给对象实例,最后更新列表记录。
堆内存是否规整,取决于GC收集器的算法,标记清除算法内存是不规整的,标记整理算法、标记复制算法内存是规整的。
在创建对象的时候有一个很重要的问题,就是线程安全,虚拟机采用两种方式来保证线程安全,CAS+失败重试和TLAB。
CAS+失败重试,CAS是乐观锁的一种实现方式,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
TLAB,为每一个线程预先在Eden区分配一块内存(该内存区域,线程只享有私有的分配权,对于使用还是共享的),JVM在给线程中的对象分配内存时,首先在TLAB分配,当对象大于TLAB中的剩余内存或TLAB的内存已用尽时,再采用上述的CAS进行内存分配。
(3)初始化零值
(4)设置对象头
例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息,这些信息存放在对象头中。
(5)执行init方法
3、HotSpot虚拟机对象的内存布局
对象在内存中的布局可以分为3块区域:对象头、实例数据和对齐填充。对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。
4、HotSpot虚拟机对象的访问定位
Java程序通过栈上的reference数据来操作堆上的具体对象。
目前主流的访问方式有:使用句柄、直接指针。
使用句柄,Java堆中将会划分出一块内存来作为句柄池,reference中存储的是句柄地址,而句柄中包含了对象的地址。


直接指针,reference中存储的是对象的地址。

 

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

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

相关文章

谷歌2022年最受欢迎Chrome浏览器扩展程序:包含Tango,Compose AI等

根据截图排序从左到右依次介绍如下: RoPro:Roblox.com网站体验增加了许多有用且独特的功能; MyBib:自动创建 APA 样式、MLA 格式和哈佛引用样式引文; eJOY English:翻译自Netflix, Youtube, iFlix上的字…

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A-D)

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A-D) 题目链接限制AJoey Takes Moneystandard input/output1 s, 256 MBBKill Demodogsstandard input/output1 s, 256 MBCEven Subarraysstandard input/output2.5 s, 256 MBDValiant’s New M…

数字经济指标构建-各省、地级市匹配上市公司数据、城市数字化指数

一、中国城市数字经济指数2017-2022年(数据代码报告) 中国城市数字化指数全面覆盖城市数字化规划、建设、运营的各个方面,能够有效评估城市各个领域的数字化建设水平和运营效果。 全国城市数字经济发展热图 数据来源:中国城市数字…

语音转换之CycleGan-VC2:原理与实战

非平行语音转换CycleGAN 之前学习了传统统计学习里的经典的语音转换模型GMM。随着深度学习的发展,出现了更好的语音转换方法,今天学习较为经典的CycleGan。 平行语音转换一般流程 典型代表就是基于GMM的语音转换。平行数据就是说源语音和目标语音一一…

矢量图斑局部狭长判断和定位局部狭长部分(PostGIS、Java、C#实现)

矢量数据在数据采集过程中由于数据处理导致出现局部狭窄的面状部分,如下图 1. 定义和解决方法 狭长结构是指图斑几何形态上窄而长的部分,符号化后出现图形粘连压盖现象,导致难以在图面上清晰地表达出来。因此,依据地图表达比例尺因素需要对狭长结构进行融解处理。在…

helm部署frps和连接

文章目录一. helm部署frps1.1 下载1.2 部署1.2.1 不开启dashboard界面1.2.2 开启dashboard界面1.2.3 卸载1.3 查看1.4 IP Port 允许端口1.5 Web Ingress二. frpc客户端连接2.1 IP Port 连接2.2 Web 域名连接一. helm部署frps 1.1 下载 mkdir -p /root/i/helm && cd…

并查集专题1_图篇

1.并查集介绍 并查集支持查询和合并操作,只回答两个节点是不是在一个连通分量中,并不回答路径问题。 如果一个问题具有传递性,可以考虑用并查集。并查集最常见的一种设计思想是把在同一个连通分量中的节点组织成一个树形结构。 2.并查集的…

动作捕捉技术应用于地面移动机器人协同

《一千零一夜》故事集中收录的《阿拉丁神灯》深受读者们的喜爱,其中阿拉丁拥有一块神奇的魔毯,它具有运载功能,可以将物体轻松便捷的从一个地方转移到另一个地方。在现实生活中,可变形布作为一种轻量便携且具有良好适应性的载体&a…

redhat9中mysql常用命令(持续更新)

目录 1、查看当前用户 2、查看选择的数据库 3、创建数据库 4、创建数据表 5、插入数据 6、查看表所以字段的内容 7、查看数据库当前密码策略 8、查看密码插件 9、更改密码策略为LOW,改为LOW或0 10、 更改密码长度 11、设置大小写、数字和特殊字符均不要求 …

微服务系列专栏介绍

文章目录一 专栏介绍1.1 微服务行业背景不同行业IT系统更新频率IT系统存在的问题微服务架构在企业中应用情况1.2 什么是微服务1.3 微服务的特点1.4 微服务诞生背景1.5 微服务架构的优势二 专栏目标三 专栏涉及技术四 专栏架构1.微服务架构:2.Go语言3.go-micro架构4.…

入侵无线WiFi的主要方式及防护要点

从攻击形态上看,无线网络攻击主要可以分为三个大类:被动型攻击、主动型攻击以及针对网络组件的攻击: 被动攻击一般发生在攻击者处于无线网络范围内并可以监视无线通信内容时,最常见的被动攻击是数据包嗅探。由于被动攻击者只是监…

HTTPS 的通信加解密过程,证书为什么更安全?

经典面试题 HTTPS 的通信加解密过程,证书为什么更安全? 考察点 《计算机网络》相关知识 了解 HTTPS 协议加解密的过程 了解数字证书认证的过程 技术点 对称加密和非对称加密 HTTPS 协议的加解密过程 数字证书认证过程 对称加密和非对称加密 对称加…

Mysql 小Tips

Mysql 小Tips 目录Mysql 小Tips1.group_concat2.char_length3.locate4.replace5.now6.insert into ... select7.insert into ... ignore8.select ... for update9.on duplicate key update10.show create table11.create table ... select12.explain13.show processlist14.mysq…

企业电子招投标采购系统源码之首页设计

​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…

字符设备驱动(二)

1. IO模型 (1)阻塞式IO:不能操作就睡觉 (2)非阻塞式IO:不能操作就返回错误 (3)IO复用 (4)信号驱动式IO (5)异步IO 2.阻塞与…

c++算法基础必刷题目——按位贪心

文章目录按位贪心1、毒瘤xor2、兔子的区间密码3、起床困难综合症按位贪心 1、毒瘤xor NC18979 毒瘤xor 题目描述 小a有N个数a1, a2, …, aN&#xff0c;给出q个询问&#xff0c;每次询问给出区间[L, R]&#xff0c;现在请你找到一个数X&#xff0c;使得 1、0⩽X<231 2、∑…

Vue(ref和$refs属性介绍与使用)

一、 Vue(ref和$refs属性介绍与使用) 在Vue中一般很少会用到直接操作DOM&#xff0c;但不可避免有时候需要用到&#xff0c;这时我们可以通过ref和$refs这两个来实现&#xff0c;本文我们就来详细的介绍下这个内容 除了自定义属性外&#xff0c;Vue实例还暴露一些有用的实例属性…

Educational Codeforces Round 140 (Rated for Div. 2)

A. Cut the Triangle 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 44 7 6 8 3 54 5 4 7 6 85 8 1 8 2 53 6 6 6 6 3 样例输出&#xff1a; YES YES YES NO题意&#xff1a;在二维平面上给定一个非退化三角形的三个顶点&#xff0c;问我们能不能用…

NVIDA CUDA和cuDNN安装教程

文章目录一. 查看自己的GPU版本是否支持cuda二 .安装CUDA三. 安装cuDNN一. 查看自己的GPU版本是否支持cuda 打开显卡的控制面板&#xff0c;查看显卡是否支持cuda 二 .安装CUDA 去官网查看cuda版本与所需系统固件的对应关系 从官网下载所需的CUDA Toolkit Archive,这里下载…

04-Css+Nginx

前端入门——CSS 1 CSS入门 1.1 初识CSS 1.1.1 概述 在学习了基本HTML标签和样式后&#xff0c;接下来学习前端开发的第二门技术。 我们发现&#xff0c;虽然标签的属性可以调整一些样式&#xff0c;但是效果不够理想&#xff0c;而我们更愿意把样式编写在<style> 标…