面试之JVM类的生命周期

2023-11-18

按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:

 加载:

类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法去中。

在加载的过程中。jvm需要做三件事:

1:通过类的全限定名来获取此类的二进制文件。

2:将这个字节流所对应的静态存储结构转换为方法区运行时数据结构

3:在内存中生成一个Java.lang.class对象,作为方法区这个类的入口

验证:

这一阶段的目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。包含(文件格式验证,元数据验证,字节码验证,符号引用验证);

准备:

准备阶段就是为非final修饰的静态变量 分配内存并设置初始值。因为静态变量和类绑定在一起的。并不需要初始化类对象访问,所以就这个静态变量放在 方法区中。

解析:

Java虚拟机将常量池内的符号引用替换为直接引用的过程。

符号引用:符号引用是一组符号来描述所引用的目标,符号引用可以任何形式的字面量。只要是使用时可以准备的定位到目标即可。

直接引用:直接可以定位到目前的指针,相对偏移

量或者一个能够定位到内容的句柄。

初始化:

  • 初始化阶段,主要是为静态变量赋予正确的初始值
  • 在初始化阶段,开始执行Java代码。初始化阶段重要的工作是执行类的初始化方法clinit().

从jvm层面分析一个方法是如何执行的。

 首先。找到这个类Application。类加载器加载。将这个类信息加载在 元空间空。然后将 执行main方法就是开启一个main 线程,将这个 方法 加入对应的 虚拟机栈栈底。然后在加对应的load方法加入对应的虚拟机栈头。将对应的config变量是方法的内部变量也压入对应的方法栈中,将对应的new Config()对象 压入对应的 堆中。然后将方法执行完。栈帧指向移动,方法执行完就会出栈。

对应的类信息都是元空间,已经对应的静态常量。常量池都是在 元空间中。

 虚拟机栈的特点以及作用:

1:线程私有。

2:方法执行会创建对应的栈帧。然后将对应的局部变量表等。

3:方法执行进入虚拟机栈,方法执行后出栈。先进后出。

4:栈深度大于虚拟机栈深度时。会报错StackOverflowError.

5: 栈需要扩展而无法申请对应的空间而OOM(比较少见的),hotspot是没有的。(当虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够内存是,将抛出OOM异常。但是hotspot虚拟机不支持栈的自动扩展

6:随着线程而生,随线程而死

7:  该区域不存在gc。

本地方法栈的特点:

1、与虚拟机栈类似。

2、区别在于本地方法为Native方法提供

3、有StackOverFlowError 和OOM

4、随线程而生,随线程而死

5、GC不会回收

元空间:

1:在jdk1.8以后才出现元空间的概念,以前叫做 永久代/方法区。

2:元空间与java堆类似,是线程共享的内存区域。

3:储存被加载的类信息,常量,静态变量,常量池

4:元空间采用的是本地内存,本地内存有多少空间,他就可以扩展到多大空间

-XX:MetaspaceSize=20M     -XX:MaxMetaspaceSize=100M

5:元空间不足时,就容易发生OOM

6:元空间很少有GC垃圾收集,一般该区域回收苛刻。能回收的信息比较少。

堆:

1:线程共享的一块区域。

2:虚拟机启动时创建

3:存放所有实列或者数组

4:可分为新生代,老年代

5:通过xms,xmx调节堆大小

程序计数器:

1、程序计数器是一块比较小的内存空间

2、是当前线程执行的字节码的行号指示器
3、java多线程执行时,每个线程都有一个独立的程序计数器,各条线程之间的程序计数器互不影响。

4、该区域不存在OOM

5、该区域不会被GC

说出几个常用的核心参数:

xms  初始化堆大小  xmx堆的最大的大小

-XX:metaspaceSize  初始化元空间大小

-XX:MaxmetaspaceSize: 申请元空间的最大

-XX:SurvivorRatio =8 设置edem去和survivor去大小的比列 默认8:1:1

-XX:MaxTenuringThreshold =  5 年龄阈值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试之JVM类的生命周期 的相关文章

  • 如何使用 Java 将 HTML 内容转换为 PDF 而不丢失格式?

    我有一些 HTML 内容 包括格式化标签 例如strong 图像等 在我的 Java 代码中 我想将此 HTML 内容转换为 PDF 文档 而不丢失 HTML 格式 有没有办法用 Java 来实现 使用 iText 或任何其他库 I use
  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • 如何使用 BufferedReader 对象从 Java 中的一行读取多个整数值?

    我正在使用 BufferedReader 类读取 Java 程序中的输入 我想读取用户的输入 该用户可以在带空格的单行中输入多个整数数据 我想读取整数数组中的所有这些数据 输入格式 用户首先输入他 她想要输入的数字数量 然后在下一行中使用多
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util

随机推荐

  • matlab动态神经网络进行时间序列预测分析

    matlab动态神经网络进行时间序列预测分析 时间序列预测问题分类 有y 无x 即 y t f y t 1 y t 2 y t f y t
  • Pycharm上Modify Run Configuration的使用方法,带参数配置

    前言 我们在搭建yolo系列目标检测模型时 往往需要对代码进行逐步调试 及时发现错误 所以本文在pycharm的基础上 对yolov6中的infer py进行逐步调试 首先我们在conda环境一切准备就绪的情况下 能在终端tenminal中
  • 【UE5 Cesium】11-Cesium for Unreal 切换Dynamic Pawn为其它Pawn

    前言 我们知道在Cesium for Unreal中默认使用的是DynamicPawn来浏览地图场景 DynamicPawn适用全球浏览 可以按自定义曲线进行飞行 但是DynamicPawn是使用的是地理参考坐标系 并不是标准的UE坐标系
  • iOS利用九切片进行切图UI不会变形

    p 1 手写代码 p p p UIImageView svRect UIImage backgroundImage UIImageimageNamed bg png backgroundImage backgroundImageresiza
  • 《机器学习》读书笔记2--线性模型

    目录 线性模型基本形式 线性回归 对数几率回归 线性判别分析 多分类学习 类别不平衡问题 ps 写在前面 本文是在参加datawhale组队学习 学习周志华老师的 机器学习 过程的学习笔记 文中出现的图片均引自 机器学习 机器学习 是初学者
  • AI绘画Stable Diffusion原理之扩散模型DDPM

    前言 传送门 stable diffusion Git 论文 stable diffusion webui Git Google Colab Notebook部署stable diffusion webui Git kaggle Noteb
  • 量化交易框架开发实践(一)

    量化交易平台指支持通过对数据进行多维度的定量分析 结合发现的特征定制策略 并能够基于历史数据对策略进行回测 最后支持实盘买卖的交易平台 从业务流上看 量化交易可以分解成 行情获取 gt 数据清洗 gt 指标计算 gt 策略开发 gt 策略回
  • RobotStudio ABB 仿真软件过期 后的处理

    首先查看当前是在试用期还是已经过期了 查看方法如下 在打开软件后的首页找到 帮助 右侧会显示当前授权状态是否为 试用 1 如果当前在试用期内 可以通过直接修改注册表方式 修改方法 找到如下位置 HKEY LOCAL MACHINE SOFT
  • 正则表达式匹配中* . c++实现

    题目描述 请实现一个函数用来匹配包括 和 的正则表达式 模式中的字符 表示任意一个字符 而 表示它前面的字符可以出现任意次 包含0次 在本题中 匹配是指字符串的所有字符匹配整个模式 例如 字符串 aaa 与模式 a a 和 ab ac a
  • QT 怎么导入qss文件?

    方式一 比较常见的方法 QFile file qss psblack css if file open QFile ReadOnly QString qss QLatin1String file readAll qApp gt setSty
  • 提高电脑寿命的维护技巧与方法分享

    在维护电脑运行方面 我有一些自己觉得非常有用的技巧和方法 下面我将分享一些我常用的维护技巧 并解释为什么我会选择这样做以及这样做的好处 首先 我经常清理我的电脑内部的灰尘 电脑内部的灰尘会影响散热效果 导致电脑发热严重甚至性能下降 因此 定
  • Google Colab 上部署 Stable Diffusion Web UI

    什么是 Stable Diffusion Web UI Colab Stable Diffusion 是 Stability AI 推出的一个基于深度学习技术文字生成图片AI模型 Stable Diffusion Web UI 是一个强大好
  • [技术经理]03 到底是能力重要,还是态度重要?

    对于一个技术团队而言 团队里面的人员是最最重要的财富 人员的招聘和人员的管理是技术经理最重要的工作之一 但是 事实也是 没有什么问题比人的问题更难处理的了 我先讲两个发生在我们团队里面的事件 今年上半年的时候 我们团队同时入职了两名前端开发
  • C语言中sizeof()和strlen()的区别

    sizeof 一 sizeof的基本概念 sizeof操作符以字节形式给出了其操作数的存储大小 操作数可以是一个表达式或括在括号 内的类型名 操作数的存储大小由操作数的类型决定 二 使用方法 1 用于数据类型 sizeof使用形式 size
  • UBUNTU16.04命令行安装PCL1.7(亲测有效)

    安装PCL点云库 最开始是按照先安装相关依赖 然后github上clone PCL相关版本包的形式安装的 编译遇到了很多问题 结果最后安装完成 但却无法运行例程 难过 又尝试了命令行的形式 命令行的形式直观简单 可安装编译好的点云库 PCL
  • [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇详细讲解了卷积神经网络CNN原理 并通过TensorFlow编写CNN实现了MNIST分类学习案例 本篇文章将分享gensim词向量Word2Vec安装
  • 时频分析常用工具:STFT短时傅里叶变换 & 小波变化

    文章目录 1 傅里叶变换的局限性 2 STFT 3 小波变换 参考 时频分析之STFT 短时傅里叶变换的原理与实现 形象易懂讲解算法I 小波变换 https www zhihu com question 58814934 1 傅里叶变换的局
  • MSCOCO数据集格式转化成VOC数据集格式

    MSCOCO数据集格式转化成VOC数据集格式 转载请注明原出处 http blog csdn net ouyangfushu article details 79543575 作者 SyGoing QQ 2446799425 SSD目标检测
  • CUDA(C)和PyCUDA(Python) GPU加速OpenCV视觉

    CUDA 本节介绍一个简单的加法程序 该程序在设备上执行两个变量的加法 虽然它没有利用设备的任何数据并行性 但它对于演示 CUDA C 的重要编程概念非常有用 首先 我们将看到如何编写一个用于添加两个变量的内核函数 内核函数的代码如下所示
  • 面试之JVM类的生命周期

    按照Java虚拟机规范 从class文件到加载到内存中的类 到类卸载出内存为止 它的整个生命周期包括如下7个阶段 加载 类的加载指的是将类的 class文件中的二进制数据读取到内存中 存放在运行时数据区的方法去中 在加载的过程中 jvm需要