JVM相关知识

2023-09-14 16:55:45

运行程序时JVM中内存区域的划分:

线程私有:

本地方法栈:

本地方法栈与虚拟机栈相似,区别是,本地方法栈为虚拟机使用的本地方法服务,虚拟机栈为虚拟机使用的JAVA方法服务。

虚拟机栈:

虚拟机栈中保存的主要是一个个栈帧,每当有一个方法被调用时,都会有栈帧入栈,方法结束时,栈帧就会被弹出,每个栈帧由局部变量表和操作数栈,动态连接,返回地址组成,
局部变量表:存放的方法中的局部变量,局部变量是基本数据类型的话直接存储到表中,如果是引用数据类型的话,则会存入对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)换言之,除了基本数据类型外,其余的数据类型都是对象的引用?
如int[] 等数组类型,其本质也还是对象。
操作数栈:用于存储方法中计算的中间结果,计算过程中产生的临时变量。
动态链接:当本方法调用其他的方法(其他方法的信息存储在方法区中)时,需要将常量池(方法区也就是元空间中的运行时常量池)中指向方法的符号引用转为在内存地址中的直接引用,而动态链接会将符号引用转化为直接引用。

返回地址:代表的是方法的出口,当方法运行结束后方法的返回地址。

程序计数器:

程序计数器是较小的内存空间(或许是无上限的),主要有两个功能,第一,当程序运行时,字节码解释器通过改变程序计数器读取指令,实现循环,分支,跳转,异常处理等功能。
第二,当线程切换时,可以为程序记录当前线程的执行位置。

线程共享的有:

堆:

最主要的是存放几乎所有的对象实例,几乎所有的对象实例以及数组都在这里分配内存。至于说几乎,是因为存在方法逃逸,当方法中的对象引用没有被返回或者未被外边使用,可以直接在栈上分配内存。在1.7之前堆内存主要分为新生代,老年代和永久代,在1.8之后永久代被元空间取代,元空间在本地内存中。对象首先会在eden区中分配,在一次新生代垃圾回收后,如果对象还存活,则会转入s0或s1区。(Eden 区->Survivor 区后对象的初始年龄变为 1),当年龄增加到一定程度,默认15,就会被晋升到老年代。
在堆中还包含一个字符串常量池:
字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。JDK1.7 之前,字符串常量池存放在永久代。JDK1.7 字符串常量池和静态变量从永久代移动了 Java 堆中。(静态变量?不是在方法区嘛。暂时记为静态变量在元空间中)将字符串常量池放入堆中是因为永久代(方法区的实现)回收效率低,只有在FULL GC时才会被回收,移入堆中可以更高效及时地回收字符串内存。

方法区(在1.8之后改为永久代并移入到直接内存中。)

是一块逻辑区域,各个线程共享的内存区域。当虚拟机需要使用一个类时,需要读取Class文件并获得相关信息,再将信息存储到方法区中。方法区会存储已被虚拟机加载的类信息,静态变量,常量,字段信息,方法信息等。
在方法区中包含一个运行时常量池,在运行时常量池中会有常量池表,这个表中包含编译器时生成的各种字面量和符号引用。字面量包括整数、浮点数和字符串字面量。(栈中的动态链接处)常见的符号引用包括类符号引用、字段符号引用、方法符号引用、接口方法符号。功能类似于传统编程语言的符号表。

两个概念

直接内存:直接内存并不是虚拟机运行时数据区的一部分,是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的。
堆外内存:堆外内存就是把内存对象分配在堆(新生代+老年代+永久代)以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。

更多推荐

Rust认识所有权(4)

认识所有权1.认识所有权2.什么是所有权?2.1程序运行管理运行的方式2.2栈(Stack)和堆(Heap)1.栈(Stack)2.堆(Heap)2.3所有权规则2.4变量作用域2.4String类型2.5内存与分配1.以String类型为参考2.变量与数据交互的方式(一):移动2.1String版本3.变量与数据交互

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

Linux内核源码分析(B.4)深度剖析Linux伙伴系统的设计与实现文章目录1\.伙伴系统的核心数据结构2\.到底什么是伙伴3\.伙伴系统的内存分配原理4\.伙伴系统的内存回收原理5\.进入伙伴系统的前奏5.1获取内存区域zone里指定的内存水位线5.2检查zone中剩余内存容量是否满足水位线要求5.3内存分配成功之

Vision Transformer(ViT)论文解读与代码实践(Pytorch)

VisionTransformerVisionTransformer(ViT)是一种基于Transformer架构的神经网络模型,用于处理计算机视觉任务。传统的计算机视觉模型如卷积神经网络(CNN)在处理图像任务时取得了很大的成功,但CNN存在一些局限,例如对于长距离依赖的建模能力较弱。ViT通过引入Transform

Windows下SpringBoot连接Redis的正确使用姿势

1.安装Redis1.1通过wsl安装redis参考官方安装文档,需要在wsl2上安装redis服务。注意我们启动redis的方式:Firstway:采用官方文档的方式:sudoserviceredis-serverstart,关闭wsl后redis在后台仍能运行,可以sudoserviceredis-serverst

【web开发】11、文件的上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、文件上传二、批量上传三、案例:混合数据(form上传)四、启用media五、案例:混合数据(Modelform上传)小结提示:以下是本篇文章正文内容,下面案例可供参考一、文件上传图片文件上传:在form里添加enctype=“multipart

上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例

长宁来福士广场是一个大型广场,坐落于上海中山公园商圈的核心区域,占地逾6万平方米,其中地上总建筑面积近24万平方米,总投资额约为96亿人民币。LED圆形屏是根据现场和客户要求定制的一款异形创意LED显示屏,进行文字、图片、视频等信息播放,应用在舞台、演播室、酒店、机场、路灯广告等LED场所,根据直径要求,可做成户外室内

Linux Systemd 配置开机自启

博文目录文章目录Systemd操作方式配置方式配置示例参考SystemdSystemd是一个用于启动、管理和监控Linux系统的初始化系统。它是许多现代Linux发行版中默认的初始化系统,取代了传统的SysVinit和Upstart。Systemd的引入在Linux社区引起了一些争议,因为它与传统的初始化系统有很大的差

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日,DataEase开源数据可视化分析平台正式发布v1.18.10版本。这一版本的功能升级包括:数据集方面,对字段管理的后台保存做了相关优化,降低了资源消耗;仪表板方面,对联动、查询结果以及过滤组件等进行了调整优化,避免系统卡顿情况的发生;视图方面,新增ECharts动态排序图、AntV组合图、Ant

Spring的 webFlux 和 webMVC

看到一个测评文章,并发在300的时候webMVC和webFlux的处理能力不相上下,当并发达到3000的时候,webFlux明显优于webMVC,有图有真相,我信了.webMVC是one-request-onethread堵塞模式,flux是非阻塞模式,是spring家族系列产品发展的两个方向.参考文档:https:/

SSM整合01

SSM01搭建SSM项目1.创建maven的web工程1.1pom.xml配置<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=

【Linux】基础IO

文章目录一.C语言文件IO1.C语言文件接口汇总2.什么是当前路径?2.默认打开的三个流二.系统文件I/O1.open(1)open的第一个参数(2)open的第二个参数(3)open的第三个参数(4)open的返回值2.close3.write4.read三.文件描述符fd四.文件描述符的分配规则五.重定向1.重定向

热文推荐