浅谈JVM内存结构

news2024/11/25 4:55:24

一、JVM内存结构的大概划分:

1.1 堆(Heap)

线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。

1.1.1 堆结构

堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。堆的内部结构按照传统的做法分成新生代和老年代,如图所示:

堆的作用是存放对象实例和数组。从结构上来分,可以分为新生代和老年代。而新生代又可以分为Eden空间、From Survivor空间(s0)、To Survivor空间(s1),新生代中Eden所占比例最大,题外话:Eden这个词来自圣经,是一个逍遥自在美好的区域,所有的对象刚创建出来的时候都存放在Eden区。新生代中各个区域的占比为:8:1:1 。之所以Eden区占比大是由于每次垃圾回收时大部分对象都被回收掉,只有少数的需要移到S0区。老年代没有划分,当对象的存活时间达到一定值时,有新生代过渡到老年代。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来的对象,和从前一个Survivor复制过来的对象,而复制到老年代的只有从第一个Survivor区过来的对象。而且,Survivor区总有一个是空的。

1.1.2 控制参数

Xms 设置堆的最小空间大小

Xmx 设置堆的最大空间大小

XX:NewSize 设置新生代最小空间大小

XX:MaxNewSize 设置新生代最小空间大小

1.1.3 垃圾回收

此区域是拦击回收的主要操作区域

1.1.3 异常情况

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常

1.2 方法区(Method Area)

线程共享。存储类信息、常量、静态变量、即时编译器编译后的代码。

1.2.1 方法区结构

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为一个堆的逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

很多人愿意把方法区称为“永久代”(Permanent Generation),本质上两者并不等价,仅仅是因为HotSpot虚拟机是设计团队选择把GC粉黛收集扩展至方法区,或者说使用永久代实现方法区而已。对于其他虚拟机(如BEA JRockit、IBM J9 等)来说是不存在永久代的概念的。再Java8中永生代彻底消失了。

1.2.2 控制参数

XX:PermSize 设置最小空间

XX:MaxPermSize 设置最大空间

1.2.3 垃圾回收

对此区域会涉及但是很少进行垃圾回收。这个给区域的内存回收目标主要是针对常量池的回收和类型的卸载,一般来说这个区域的回收"成绩"比较难以令人满意

1.2.4 异常情况 

根据Java虚拟机的规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

1.3 方法栈(JVM Stack)

线程私有。存储局部变量表、操作栈、动态链接、方法出口,对象指针。

1.3.1 方法栈结构

每个线程会由一个私有的栈。每个线程中方法的调用又会在本栈中常见一个栈帧。再方法栈中会存放编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间时完全确定的,在方法运行期间不会改变局部变量表的大小)

1.3.2 控制参数

Xss 控制每个线程栈的大小

1.3.3 异常情况

在Java虚拟机规范中,对这个区域规定了两种异常状况:

StackOverflowError::异常线程请求的栈深度大于虚拟机所允许的深度时抛出;

OutOfMemoryError:虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出。

1.4 本地方法栈(Native Menthod Stack)

线程私有。为虚拟机使用到的Native方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。

1.4.1 本地方法栈结构

本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈作为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

1.4.2 控制参数

在SunJDK中本地方法栈和方法栈是同一个,因此也可以用Xss控制每个线程的大小。

1.4.3 异常情况

与虚拟机栈一样,本地方法栈区也会抛出StackOverflowError和OutOfMemoryError异常。

1.5 程序计数器(Program Counter Register)

线程私有。有些文章也翻译成PC寄存器(PC Register)同一个东西。它可以看作是当前线程所指向的字节码的行号指示器。指向下一条指向的指令

它的作用可以看作当前线程所执行的字节码行号指示器。

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

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

相关文章

喝汽水问题:1瓶汽水1元。2个空瓶可以换1瓶汽水,给20元,可以买多少汽水 (7.19)

泪目!!!终于是自己完完整整写出的代码了,不翻资料也没看参考代码 (之前的要么和老师练习,要么找教材东拼西凑) 方法2:数学角度看bottle价值0.5 元,20元最多可换40bottl…

Python venv 和 virtualenv 虚拟环境的基本使用

1.前言 venv 和 virtualenv 都是搭建虚拟环境的工具,virtualenv 是第三方开源的,而 venv 作为 virtualenv 的一个子集自 Python3.3 开始集成到标准库中,在 virtualenv 的文档中可以看到他们的区别: 没有 app-data 种子方法&#…

LLM 盛行,如何优雅地训练大模型?

作者 | 王嘉宁 整理 | NewBeeNLP https://wjn1996.blog.csdn.net/article/details/130764843 大家好,这里是 NewBeeNLP。 ChatGPT于2022年12月初发布,震惊轰动了全世界,发布后的这段时间里,一系列国内外的大模型训练开源项目接踵而…

手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级

什么是微服务?一看就会系列! 一、手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二、手把手教你搭建SpringCloud项目(二)生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

公司老项目改造适配不同分辨率2k、3k、4k

项目改造适配不同分辨率 最近公司要做项目适配2k、3k、4k屏的分辨率,在网上找了很多中方案,常用且方便的是使用zoom全局缩放,因为是老项目所以对样式进行了重写整体使用了flex百分比布局 使用 1、在utils文件夹中新建一个zoom.js文件 这个是…

ACL 2023 | 持续进化中的语言基础模型

尽管如今的 AI 模型已经具备了理解自然语言的能力,但科研人员并没有停止对模型的不断改善和理论探索。自然语言处理(NLP)领域的技术始终在快速变化和发展当中,酝酿着新的潮流和突破。 NLP 领域的顶级学术会议国际计算语言学年会 …

java中的三大集合类各自的特点以及适用场景

目录 ​编辑 三大容器的介绍 使用场景介绍 List 实现类 Map 实现类 Set 实现类: 三大容器的介绍 List(列表) 结构:由有序的元素序列组成,可以包含重复元素特点:可以通过索引访问元素,插入的顺…

SQL注入实操(更新中)

文章目录 一、sqli-lab靶场搭建二、通关笔记1.Less-1a.单引号‘b.updatexmlc.concatd.unione.information_schemaf.GROUP_CONCATg.select 1,2 2.Less-23.Less-3a.怎么找到注入点b.判断SQL注入漏洞的类型c.闭合语句d.如何判断显示位e.答案 4.Less-45.Less-5a.判断注入漏洞的依据…

PhpStudy2016-2018-RCE 漏洞复现

漏洞描述 PHPStudyRCE(Remote Code Execution),也称为phpstudy_backdoor漏洞,是指PHPStudy软件中存在的一个远程代码执行漏洞。 漏洞影响范围 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apac…

WEB:shrine

背景知识 了解Flask SSIT模板注入 题目 进行代码审计 import flask import osapp flask.Flask(__name__) /*创建了flask包下的Flask类的对象,name是一个适用于多数情况的快捷方式。有了这个参数,Flask才知道在哪里可以找到模板和静态文件*/app.confi…

HYPE分布式水文模型教程

详情点击链接:HYPE分布式水文模型建模方法与案例分析 前言 HYPE(Hydrological Predictions for the Environment, HYPE)是由瑞典皇家水文气象局(SMHI)在HBV和HBV-NP模型基础上开发的新一代分布式水文模型,已经在全球众多地区得…

同样是办公管理系统,钉钉和OA哪个更出色?

企业在选择办公协同系统的时候,通常搜索到“钉钉”和“OA系统”,两者都属于办公管理类型,但哪个更适合企业使用?两者又有哪些区别呢?小编整理了一下两者的对比和侧重的点,今天我们就来聊聊两者的区别吧~ 天…

【Linux】inode软硬连接

文章目录 📖 前言1. 文件系统1.1 磁盘的物理结构:1.2 CSH和LBA:1.3 IO的基本单位:1.4 文件系统结构:1.5 认识inode: 2. 软硬连接2.1 目录和文件的硬连接数:2.2 软连接:2.3 硬连接&am…

Clickhouse基础和基本优化

CK基础和基本优化 一、ClickHouse的特点列式存储高吞吐写入能力数据分区与线程级并行表引擎的使用MergeTreeReplacingMergeTreeSummingMergeTree 二、SQL操作1.Insert2.Update 和 Delete3.查询操作4.alter操作5.导出数据 三、基于表的分布式集群集群写入流程( 3分片…

react和vue2/3父子组件的双向绑定(sync、emit、v-model)

目录 Vue .sync(2.3.0) $emit (2.3后) 自定义组件的 v-model 2.2.0 v-modelemits(3.0取消了.sync) React 父组件回调函数 相关基础 框架 MVC (Model View Controller)/MVP(Model View…

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接:https://sysin.org/blog/virtualbox-7/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2022 年 10 月…

CentOS7中安装Mysql8并配置远程连接和修改密码等

场景 使用Vmware等虚拟机软件搭建CentOS7系统,需要在其上安装Mysql8版本数据库。 注: 博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 实现 1、去mysql官网手动下载rpm包并上传到服务器,或者直接通过wget…

Python结合Selenium简单实现Web自动化测试

这篇文章是入门级别的应用Python Selenium进行自动化测试,包括环境搭建及简单的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这篇文章是入门级别的应用Python Selenium进行自动化测试,包括环境搭建及简单的实例。基…

数据库及数据表的相关操作(一)

目录 一、管理逻辑库与数据表二、常用数据类型和约束2.1 数字数据类型2.2 字符串数据类型2.3 日期数据类型2.4 字段约束 三、索引运行机制和使用原则3.1 创建索引3.2 添加与删除索引3.3 索引的使用原则 一、管理逻辑库与数据表 sql语言的分类: ​ DML数据操作语言…

linux之Ubuntu系列(四)用户管理 用户和权限 chmod 超级用户root, R、W、X、T、S 软链接和硬链接 shell

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。 w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移…