JVM知识总结(持续更新)

JVM 常见知识点总结 jvm常见知识点总结:jvm内存结构,垃圾回收算法,垃圾收集器,gcroots,类加载机制等 阅读详情

java内存区域

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域:

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 堆
  • 方法区
    在这里插入图片描述

程序计数器

记录下一条需要执行的虚拟机字节码指令的地址:

  • 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
  • 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

虚拟机栈

虚拟机栈是描述java方法执行的线程内存模型,是线程私有,生命周期同线程一样。

方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。

栈由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似,两者都是先进后出的数据结构,只支持出栈和入栈两种操作。
局部变量表 主要存放了编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)
操作数栈主要作为方法调用的中转站使用,用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。
动态链接 主要服务一个方法需要调用其他方法的场景。当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用。

Java 方法有两种返回方式,一种是 return 语句正常返回,一种是抛出异常。不管哪种返回方式,都会导致栈帧被弹出。也就是说, 栈帧随着方法调用而创建,随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。

这个内存区域规定了两类异常状态:

  1. 一是StackOverFlowError 异常,这个在方法出现无无限递归是就会出现,原因是线程请求栈的深度超过当前 Java 虚拟机栈的最大深度
  2. 二是OutOfMemoryError异常,如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常

本地方法栈

和虚拟机栈作用类似,区别是虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的本地方法服务

堆

虚拟机中所管理的内存最大的一块区域,作用是为java对象分配内存。

Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代;再细致一点有:Eden、Survivor、Old 等空间。进一步划分的目的是更好地回收内存,或者更快地分配内存。这个后面讲垃圾回收时会细讲。

堆这里最容易出现的就是 OutOfMemoryError 错误,并且出现这种错误之后的表现形式还会有几种,比如:

  1. java.lang.OutOfMemoryError: GC Overhead Limit Exceeded:当 JVM 花太多时间执行垃圾回收并且只能回收很少的堆空间时,就会发生此错误。
  2. java.lang.OutOfMemoryError: Java heap space :假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发此错误

方法区

方法区和堆一样,是线程共享的内存区域,它用于存储被虚拟机加载的类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

永久代和元空间是实现方法区的两种方式, 从JDK6开始,HotSpot就开始放弃永久代,逐步采用本地内存(元空间)来实现方法区:

  1. 永久代有 -XX:MaxPermSize JVM 的上限,不设置也有默认大小,无法进行调整,而元空间使用的是本地内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。

当元空间溢出时会得到如下错误:java.lang.OutOfMemoryError: MetaSpace

你可以使用 -XX:MaxMetaspaceSize 标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。-XX:MetaspaceSize 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。

  1. 元空间里面存放的是类的元数据,这样加载多少类的元数据就不由 MaxPermSize 控制了, 而由系统的实际可用空间来控制,这样能加载的类就更多了。

  2. 在 JDK8,完全放弃了永久代的概率,改用了使用本地内存的元空间来代替。

相对堆而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,但条件比较苛刻,所以这个区域的回收效果比较难令人满意。

判断一个类是否无用:

  • 该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。
  • 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则通常是很难达成的。
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

Java虚拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是和对象一样,没有引用了就必然会回收。

运行时常量池

方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic Reference)的 常量池表(Constant Pool Table) ,这部分内容将在类加载后存放在方法区的运行时常量池

字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

JDK1.7 之前,字符串常量池存放在永久代。JDK1.7 字符串常量池和静态变量从永久代移动了 Java 堆中。这是因为永久代(方法区实现)的 GC 回收效率太低,只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。

运行时常量池、方法区、字符串常量池这些都是不随虚拟机实现而改变的逻辑概念,是公共且抽象的,Metaspace、Heap 是与具体某种虚拟机实现相关的物理概念,是私有且具体的。

对象的创建

【JVM基础内容速查表】JVM基础知识 默认参数 GC命令 工具使用 JVM参数设置、说明、使用方法、注意事项等(持续更新) 一、JVM前置知识 1. -X、-XX含义 2. JVM参数值的类型和设置方式 3. 查看GC时用到的命令和JVM参数 4. 查看JVM默认参数 二、垃圾收集器选择 -XX:+UseSerialGC -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseG1GC 阅读详情

相关推荐

基于QEMU的openEuler aarch64虚拟机快速部署与漏洞验证指南

本文提供了一份基于QEMU在个人电脑上快速部署openEuler aarch64虚拟机的详细指南。内容涵盖从软件准备、目录规划、QEMU安装、虚拟磁盘创建到系统安装与SSH配置的全过程,并以CVE-2024-1086内核漏洞为例,演示了如何在该虚拟环境中进行安全漏洞的验证与补丁测试,为安全研究和运维测试提供了一个低成本、高效率的ARM架构沙箱环境。

earth的博客 438

JVM知识总结

JVM知识点总结 什么是jvm jvm就是java虚拟机,本质上是一个程序虚拟机。所以我们首先得搞懂什么是虚拟机,虚拟机是在操作系统上层的一款软件,分为程序虚拟机和系统虚拟机,程序虚拟机就是用于执行程序的,系统虚拟机可以用于模拟一台物理设备。jvm是一台程序虚拟机用于执行字节码文件。 jvm怎么工作的 程序首先经过词法分析,分析出关键字,变量和常量,接着进行语法分析分析出程序执行的语法树。接着生成字节码文件。字节码文件就是java程序和虚拟机之间沟通的桥梁。jvm的主要构成部分分为三层分别为类加载层,运行时

guiguchunqiu的博客 1383

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

本文通过讲解MCU CAN解包模块的模块设置、输入输出信号的设置及仿真测试验证,说明了CAN解包模块的设置方法、CAN解包模块输入输出信号的设置方法以及CAN解包模块的仿真测试及修正方法。在模型搭建过程中,建议养成一种搭建完成仿真测试验证的习惯,在模块阶段发现错误,解决错误,避免在后期模块集成之后报出大量错误,增加解决错误的工作量和难度。希望通过本文的介绍能给相关技术人员带来一些参考和帮助。

qq_43011586的博客 5681

JVM知识点(全,一篇搞定)

1、什么是JVM JVM是Java程序运行的平台,它就像一台虚拟出来的计算机一样,负责执行Java编译好的字节码文件。JVM具有非常严格的实现规范,大多数操作系统都可以安装JVM,为Java语言的跨平台性起到了关键的作用。 JVM(Java虚拟机)是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象的硬件,堆栈,寄存器等,还具有相应的指令系统。

qq_35462834的博客 2765

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3328

俄罗斯方块 C++控制台版

一、创建方块 wstring tetromino[7]; tetromino[0].append(L"..X...X...X...X."); // Tetronimos 4x4 tetromino[1].append(L"..X..XX...X....."); tetromino[2].append(L".....XX..XX....."); tetromino[3].append(L"..X..XX..X......"); tetromino...

一只大鸽子的博客 1622

大白话带你认识JVM

前言 如果在文中用词或者理解方面出现问题,欢迎指出。此文旨在提及和而不深究,但会尽量效率地把知识点都抛出来 一、JVM的基本介绍 JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现··· 好,其实抛开这么专业的句子不说,就知道JVM其实就类似于一台小电脑运行在windows或者linux这些操作系统环境下...

说出你的愿望吧 943

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

jvm知识点总结

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。五、对象分配规则对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。

qq_62803338的博客 1180

HCIE-Datacom笔试题库

关于HCIE Datacom笔试考试题目整理!

坏坏-5的博客 609

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 683

JVM知识点持续更新

JVM Question 进程和线程的区别 进程是什么? 进程就是计算机开启了一个应用程序,是一次应用程序执行过程.典型例子就是windows下的任务管理器看到的每一个就是一个进程.是计算机执行的基本单位,一个进程包含多个线程 线程是撒? 线程是和进程类似的东西,但是线程更加的轻量级,是更小的执行单位. java中线程共享堆和方法区,每个线程有自己独自的程序计数器,虚拟机栈,本地方法...

stanWang的博客 258

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2079

JVM核心知识点(持续更新中)

JVM核心知识点常考面试题(持续更新中)JVM 结构 JVM 结构 https://www.processon.com/view/link/64eaf5bd8ae8db1df6e18f88

陌守 286

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jvm知识点汇总-持续更新

JVM内存模型 1> 线程栈使用栈数据结构,FILO 2> 线程栈、方法区(元空间 之前的永久代) 使用直接内存 3> 新生代 : 老年代 : 默认 1:2 4> eden比from比to : 8:1:1 from和to又称为s0,s1或者s1,s2 5> 操a=1会先将1入操作入栈,然后a分配空间,操作数栈出栈 6> 分代年龄,cms默认6、非cms默认15(且最大15,因分代年龄占4字节) 7> TLAB的全称是Thread Local Allocation

小安灬的博客 587

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM面试知识归纳(持续更新)

JVM主要分三块: 类加载子系统 执行引擎 java运行时数据区 本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法 栈(虚拟机栈和本地方法栈)、程序计数器是线程私有的很好理解:每个线程执行都需要记录代码执行的位置和所需要的变量已经方法调用(主要是代码的开始地址) 这样当然需要为每一个线程维护自己的栈和计数器了 虚拟机栈的每个方法栈桢都包括: java...

weixin_40695328的博客 248

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM知识查漏补缺学习记录(持续更新)

JVM知识查漏补缺学习记录 JVM介绍 jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 JDK、JRE、JVM三者关系 JR

qq_30836691的博客 625

Java知识点总结-JVM篇(持续更新中。。。)

Java知识点总结-JVM篇

赣州林书豪的博客 84

JVM整体知识体系深度学习__JVM与Java体系结构【持续更新】

JVM整体知识体系深度学习 一、JVM与Java体系结构。 前言 是否遇到过一下问题。 运行的线上系统突然卡死,系统无法访问,甚至直接OOM【OutOfMemory 内存溢出】 JVM GC问题 新项目上线前、JVM参数设置。 JVM面试原理概念性东西不清楚。调优、GC问题等解决方案不了解。 垃圾收集机制为我们打理了很多繁琐的工作、大大提高了开发的效率 。但是垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高拓展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。

Maxim的博客 459

JVM整体知识体系深度学习__堆【持续更新】

八、堆 (Heap)【重点】 8.1、堆的核心概述 一个JVM实例只存在一个堆内存、堆也是Java内存管理的核心区域。 进行验证JVM是否与堆内存一一对应。 设置两个线程。分别设置他们最大最小堆空间。 -Xms10m -Xmx10m -Xms20m -Xmx20m 在JDK的bin包中找到 jvisualvm.exe 执行. 另外一种查看方式 IDEA里插件里安装VisualGC 重新运行IDEA从右下角可以看到查看窗口。 Java堆区在JVM启动的时候即被创建、其

Maxim的博客 217

JVM知识点思维导图(详细)

这是自己看JVM学习视频,整理的JVM思维导图,以下是截止目前写博客时整理的知识点,后续会持续更新 更新地址(gitee):https://gitee.com/smile-coding/study-xmind-or-note/tree/master/xmind/jvm 如果对你有帮助,给个小心心支持一下哈(star) ...

笑笑是一个码农 1538

从JVM角度重构Java核心语法知识体系(持续更新)

文章目录前言变量基于值的基本类型变量包装类基于引用的对象类型变量对象的引用强引用软引用弱引用虚引用对象的存储对象在堆中具体的存储结构数组的存储对象的类型字段类字段构造函数构造函数中的this方法this关键字类方法方法重载对象的初始化过程 前言 在java中万物都可抽象为对象,每个对象都有自己的存储空间,可以存储其他对象,每个对象都有一种类型,同一种类型的对象接收相同的消息完成特定的动作.在学习对象之前,我们因该先搞清楚变量,基本类型,引用之间的关系. 变量 变量表示内存中的存储位置。它有一个名称,叫做变量

有术无道止于术,有道无术尚有可为。 1864

JVM整体知识体系深度学习__方法区【持续更新】

九、方法区【重点】 9.1、栈、堆、方法区的交互关系 整体数据区情况 9.2、方法区的理解 《Java虚拟机规范》中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。” 但对于Hot Spot JVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于Java堆的内存空间。 方法区(Method Area)与ava堆一样,是各个线程共享的内存区域。 方法区在JVM启动的时候被创建,并

Maxim的博客 279

JVM虚拟机 基础知识(持续更新中~)

m0_74969835的博客 298

JVM整体知识体系深度学习__运行时数据区概述及线程【持续更新】

三、运行时数据区概述及线程 JDK1.8之后数据区。【在下面详细介绍】 3.1、内存的概念 ​ 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略。保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规划,来探讨一下经典的JVM内存布局。 3.2、数据区内部线程所属 ​ Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会

Maxim的博客 131

深入理解Java虚拟机思维导图(部分内容)持续更新.....

点击查看思维导图,持续更新

weixin_43280591的博客 237
上一篇: Graphormer
Cestbo1
博客等级 码龄10年 53粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值