【JVM】JVM 内存结构

程序计数器

Cpu 要不停的切换执行线程,所以在切换回同一个线程的时候要知道程序执行到哪了,程序计数器(PC 计数器),用来存储指向下一条指令的地址,也就是将要执行的代码。
程序的分支、循环、跳转、异常处理、线程恢复都需要程序计数器。
程序计数器是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域

虚拟机栈

概述

每个线程在创建的时候都会创建一个虚拟机栈,虚拟机栈里存储的是一个个栈帧,对应着一次次的 Java 方法调用,是线程私有的,生命周期与线程一致。
虚拟机栈对栈帧的操作只有压栈和出栈两个操作,在一个活动线程中,只有正在执行的方法的栈帧是有效的,这个栈帧被称作当前栈帧,与当前栈帧对应的方法叫做当前方法,当前方法所对应的类叫做当前类。

栈帧的结构

栈帧主要由四部分组成:

  • 局部变量表:存储方法的参数和定义在方法中的局部变量
  • 操作数栈:在字节码执行的过程中,向操作数栈中写入和写出数据,主要用于保存计算的中间结果,同时作为程序执行过程中,变量的临时存储
  • 动态链接:每一个栈帧中都包含一个指向运行时常量池中这个栈帧所属方法的引用
    在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
  • 方法返回地址

本地方法栈

本地方法栈类似于虚拟机栈,栈帧对应的方法为本地方法,native 修饰的方法,一般为 C语言编写的

内存划分

Java 堆是 Java 管理的最大一块内存,被所有线程共享。堆内存的唯一目的就是存放对象实例,几乎所有的对象实例的内存都是在这里被分配的。
Java 堆被分成两个代,新生代和老年代,新生代又被分为 eden 区和 survivor 区(from 和 to),分代的唯一目的就是使垃圾回收更有效。

  • 新生代:新对象和没有到达一定年龄的对象都在年轻代
  • 老年代:被长时间使用的对象,老年代的空间要比新生代大很多

年轻代

年轻代是几乎所有新对象创建的地方,年轻代被分为两个区域,eden 区和 survivor 区,suvivor 区又被分成两个部分,from 和 to,比例是 8:1:1,当年轻代内存满了之后会发生 GC,这种 GC 被称为 Minor GC

  • 几乎所有新创建的对象都会在 eden 区被分配内存
  • 当 eden 区满了会发生第一次 GC,扫描 eden 区将存活的对象都移动至 survivor from 区,清除掉垃圾对象
  • 当 eden 区再次触发 GC 的时候,会扫描 eden 区和 survivor from 区,对这两个区域进行垃圾回收,将存活的对象移动至 survivor to 区,同时将年龄 +1
  • 清空 eden 区和 survivor from 区后,将 from 区和 to 区交换,也就是说谁空谁是 to 区

老年代

老年代存储的对象包括经过许多轮 Minor GC(年龄15) 后仍然存活的对象和大对象

快速分配策略和逃逸分析

TLAB

对 Eden 区进行划分,为每个线程划分一个线程私有的缓存,多线程同时分配的时候,使用 TLAB 可以进行快速分配避免一些多线程的安全问题,这就是快速分配策略

逃逸分析

器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
逃逸分析的基本行为就是分析对象动态作用域:

  • 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。
  • 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中,称为方法逃逸。

方法区

永久代和元空间

  1. 方法区是 JVM 规范中的定义的一个概念,具体实现各个jvm厂商可能不同,以 HotSpot 为例,在 Java7 中使用永久代来实现方法区,永久代在物理上是与堆空间连续的受JVM垃圾回收的管理;在Java8中,使用了元空间来代替永久代实现方法区,元空间使用的是本地内存也就是堆外内存,不受JVM管理,因此很少出现方法区的内存溢出。
  2. 永久代和元空间存储的内容是不同的,元空间存储的是类的元信息,静态变量和常量池都并入堆中;相当于永久代的内容被划分到了堆(静态变量和常量池)和堆外内存(类的元信息)
    方法区的内部结构
    方法区用于存储已经被虚拟机加载的类型信息、常量、静态变量以及即时编译器编译后的代码缓存。

运行时常量池

  1. 常量池表:
    我们知道常量池是 class 字节码文件的一部分,主要存储的是字面量和符号引用(类和接口的全限定名;变量的名称和描述符;方法的名称和描述符)
    一个 Java 的类、接口编译后会产生一个字节码文件,这个字节码文件通常需要数据的支持,但是这个数据可能会很大,不能存在字节码中,所以就换一个方式存储在常量池表中,然后字节码有指向这个常量池的符号引用。下图中的#2即为符号引用,引用了常量池
    常量池可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。
    在这里插入图片描述
  2. 运行时常量池:
  • 在类加载到虚拟机之后会创建对应的运行时常量池
  • 常量池表是 Class 字节码文件中的一部分,用于存储编译时期生成的各种字面量和符号引用,这一部分在类加载后会被存储到方法区的运行时常量池中
  • 运行时常量池中包含了各种不同的的常量,既包括在编译期间就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或字段引用。此时不再是常量池中的符号地址了,这里换为真实地址
  • 运行时常量池,相对于 Class 文件常量池的另一个重要特征是:动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中,String 类的 intern() 方法就是这样的

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

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

相关文章

解决for循环效率慢的关键在于向量化

在探讨如何通过使用向量化来提升for循环的效率之前,我们需要先理解为什么传统的for循环在某些情况下会成为性能瓶颈,并深入剖析向量化的基本原理和优势。随后,我们将详细阐述向量化如何在实际编程中应用,并对比向量化前后的性能差…

QuickBooks 2024 for Mac:财务智慧,触手可及

QuickBooks 2024 for Mac是一款专为Mac用户设计的专业财务管理软件,它集成了多种实用功能,助力企业和个人用户高效管理财务事务。 📊 全面的财务管理工具:QuickBooks 2024 for Mac 提供了一套全面的财务管理功能,包括…

用免费的可视化工具制作3D智慧城市大屏,融合数字孪生,引领数据升级

在如今数据驱动的时代,越来越多的场景中都有可视化大屏的身影,许多企业和政府部门也从常规的二维看板渐渐地转向更加炫酷,立体的3D可视化大屏。3D可视化大屏成为了展示复杂数据、实时监控业务动态的重要工具。本文将详细介绍如何使用免费的数…

爬虫 属性 方法

在Python中,爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库,用于从HTML或XML文件中提取数据。它创建了一个解析树,方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先,你需要安装BeautifulSoup和lxml&…

物联网工业级网关解决方案 工业4G路由器助力智慧生活

随着科技的飞速发展,无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代,一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能,助力我们步入智慧新纪元。 一、快速转化&…

Python处理excel数据详解

1.导入文件 注意:要把excel放到跟你的python文件在同一个地方 import pandas as pd import numpy as np dfpd.read_excel("鸢尾花训练数据.xlsx",engine"openpyxl") import pandas 先引入 (若没有下载 需要在终端下载 pip install pandas)…

LAMP架构的源码编译环境下部署Discuz论坛

一、LAMP架构 LAMP架构是一种常见的用于构建动态网站的技术栈 组成功能Linux(操作系统)LAMP 架构的基础,用于托管 Web 服务器和应用程序Apache(Web服务器)接收和处理客户端请求,并将静态和动态内容发送给…

Python爬取豆瓣电影+数据可视化,爬虫教程!

1. 爬取数据 1.1 导入以下模块 import os import re import time import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent from openpyxl import Workbook, load_workbook1.2 获取每页电影链接 def getonepagelist(url,headers):try:r reque…

如何用matplotlib绘制图像分类任务的类别特征空间分布

import matplotlib.pyplot as plt import numpy as np from sklearn.decomposition import PCA from sklearn.datasets import load_iris from mpl_toolkits.mplot3d import Axes3D# 加载示例数据(Iris 数据集) data load_iris() X data.data y data.…

使用自定义注解和Spring AOP实现前后置方法调用

使用自定义注解和Spring AOP实现前后置方法调用 在开发过程中,经常会遇到需要在方法执行前后添加一些逻辑的情况,例如记录日志、性能监控、事务管理等。使用Spring AOP(Aspect-Oriented Programming)和自定义注解,可以…

适用于高海拔地区的工业路由器产品

1、西藏背景 西藏,这个位于中国西南部的神秘之地,以其雄伟壮观、神奇瑰丽的自然风光和深厚的文化底蕴,被无数人视为心中的圣地。这里属于高原性气候,具有气温低、气压低,降水少,生态环境十分恶劣。西藏被誉…

学懂C#编程:常用高级技术——学会C#的高级特性 LINQ

LINQ(Language Integrated Query)是C#中的一项强大特性,它允许开发者以一种统一的方式查询和操作各种数据源,如集合、数据库、XML等。LINQ将查询功能直接集成到C#语言中,使得数据查询和操作变得更加直观和高效。 LINQ…

python 分析nginx的error.log日志 然后写入到 mongodb当中 并且解决mongodb无法根据id删除数据的问题

废话不多说 直接上代码 import re import os import pymongo import uuid import bson def extract_unresolved_info(log_path):unresolved_info []with open(log_path, r) as file:log_text file.read()lines log_text.split("\n")for line in lines:# 这种属于主…

软件测试面试200问【答案+文档】

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行,可以实现跨平台&#x…

雷池WAF+Modsecurity安装防护及系统加固

君衍. 一、雷池WAF1、什么是雷池2、什么是WAF3、雷池的功能4、WAF部署架构5、整体检测流程 二、雷池WAF环境依赖1、查看本地CPU架构2、Docker安装2.1 卸载旧版本2.2 安装yum-utils工具包2.3 设置镜像仓库2.4 安装docker2.5 启动docker并查看版本 3、Docker Compose安装3.1 卸载…

QueryClientProvider is not defined

QueryClientProvider is not defined 运行一个svelte的项目,报错如上,前后查找解决不了,然后没办法, 本来是用yarn 安装的依赖,改用npm install,再次运行就成功了

制氢厂氢气泄漏安全监测:氢气传感器守护“氢”安全

随着全球能源结构的转型和清洁能源的需求日益增长,氢能作为一种高效、清洁的能源载体,受到了广泛关注。制氢厂作为氢能产业的重要组成部分,其安全问题也日益凸显。在制氢过程中,氢气泄漏是潜在的安全隐患之一,因此&…

centos 安装zabbix 6.4.16 server client

Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.4.16 源码安装 Zabbix Agent 6.4.16 源码安装 MySQL 8.0.28 yum安装 Nginx 1.…

【Python】Python检查文件或文件夹路径是否存在

目录 问题背景 功能实现 代码解析 问题背景 在某些场景中,我们需要在使用文件或者文件夹前判断一下其是否存在,以防出现一些意外的报错,为了更好的使用该功能,可以把这个功能封装成为一个函数,具体实现如下: 功能实…

大数据学习之Clickhouse

Clickhouse-23.2.1.2537 学习 一、Clickhouse概述 clickhouse 官网网址:https://clickhouse.com/ ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 OLTP(联机事务处理系统)例如mysql等关系型数据库,在对于存储小数据量的时候&#xff…