Java面试题,JVM相关问题

news2024/11/15 19:45:34

JVM相关问题

  • 一 、JDK、JRE、JVM
  • 二、内存管理
  • 三、GC如何判断对象可以被回收(这是JVM的基础)

一 、JDK、JRE、JVM

  • JDK:Java Development Kit【Java开发工具】,提供给Java开发人员来使用的。
  • JRE:Java Runtime Environment【Java运行时环境】,提供给需要运行Java程序的用户来使用的。
  • JVM:Java Virtual Machine【虚拟机】,将Java编译后的字节码文件.class,解释成机器代码在这里插入图片描述
  1. .java文件通过 “JDK” 的 “java工具” 的 “javac”,编译成.class文件
  2. .class文件在不同操作系统的JVM上,调用lib(类库),将.class文件解释成对应操作系统的机器码

二、内存管理

在这里插入图片描述

  1. 对象内存管理介绍
  • 编译好的java程序需要运行在JVM中;
  • 程序,无论是代码还是数据,都要存储在内存中;
  • JVM为java程序提供并管理所需要的内存空间;
  • JVM内存分为“堆”、“方法区”、“栈”、“本地方法栈”、“程序计数器”,其中堆和方法区是线程共有的;栈、本地方法栈和程序计数器是线程私有的。
  • 这部分空间用于存储使用new关键字所创建的对象。
  • 访问对象需要依靠引用变量,当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围,该对象中所有成员变量也随之被回收。所以成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束
    在这里插入图片描述
  • 这部分空间用于存储程序运行时在方法中声明的所有局部变量。例如:main()方法中有如下代码
  • 一个运行的Java程序从开始创建到结束会有多次方法的调用;JVM会为每一个方法的调用在栈中分配一个对应空间,这个空间称为该方法的栈帧;一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据,当某个方法调用完成后,其对应的栈帧将被清楚,局部变量失效。
    在这里插入图片描述
  1. 方法区
  • 存放类的所有信息(方法和变量)。java程序运行时,首先会通过类加载器载入类文件的字节码信息,经过解析后将其装入方法区。
  • 当类的信息被加载到方法区时,除了类的类型信息外,同时类内的方法定义也被加载到方法区,类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中一份方法定义的,同时也是同用一个方法区的Class。
    在这里插入图片描述
  1. 本地方法栈
  • 本地方法栈与虚拟机的作用相似,不同之处在于虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈则为虚拟机使用到的Native方法。有的虚拟机直接把本地方法栈和虚拟机栈合二为一。
  • 会抛出stackOverflowError和OutOfMemoryError异常

三、GC如何判断对象可以被回收(这是JVM的基础)

  1. 判断方法
  • 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收
  • 可达性分析法:从GC Roots开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象
  1. 引用计数法的特殊情况

可能会出现A引用了B,B又引用了A,这时候就算他们都不再使用了,但因为相互引用,计数器=1,永远无法被回收

  1. GC Roots的对象有
  • 虚拟机栈中的引用对象(即new出来的对象)
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象
  1. 可达性算法
  • 可达性算法中的不可达对象并不是立即死亡的,对象拥有一次自我拯救的机会:第一次是经过可达性分析发生没有与GC Roots相连接的引用链,第二次是在由虚拟机自动建立的Finalizer队列中判断是否需要执行finalize()方法
  • 当对象编程(GC Roots)不可达时,GC会判断该对象是否执行过finalize方法,若执行了则直接回收。否则,若对象未执行过finalized方法,将其放入F-Queue队列,由低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则对象复活。
  • 每个对象只能触发一次finalize()方法
  • 由于finalize()方法运行代价高昂,不确定性大,无法保证各个对象的调用顺序,不推荐大家使用

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

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

相关文章

Solid Edge 放样使用引导曲线

放样用引导曲线的时候被一个错误提示卡了挺长时间——“选来用作路径或横截面的所有边必须连接在一起”,所以记录一下遇到的问题。基础的操作可以去看帮助文件https://docs.sw.siemens.com/zh-CN/doc/246738425/PL20211001099989437.feature_modeling/feat12c&#…

Sprig框架集成(SSM框架) | Sping+SpringMVC+Mybatis

SSM框架 SSM是spingspringMVCmybatis集成的框架:标准的MVC模式,整个系统划分为表现层,controller层,service层,DAO层四层 Spring(业务层) Spring就像是整个项目中装配bean的大工厂,在…

MySQL server options

介绍 MySQL安装部署时,经常会关注一些参数是否合理。其实这些参数分为两类型。环境中调整的绝大部分是引擎层方面的。服务层参数,就是mysqld服务启动时的参数,如:datadir,port,socket之类的的,…

多重背包问题——单调队列优化

一、多重背包问题 我们在之前的文章中曾经讲解过多重背包问题,当时我们讲解了两种方法,一种方法就是三重循环,这种方法最为朴素好想。但是这种方法的时间复杂度非常高,后来我们想到了二进制优化的方式。那么今天我们将再介绍一种…

Java实习------Java基础2

基础语法基本数据类型 熟悉Java有哪些数据类型定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。Java语言提供了八种基本类型。六种数字类型(四个整数型,两个…

18. 循环语句while,for语句的详解

python 中的循环语句只有 for 和 while两种&#xff0c;没有do…while循环&#xff0c;这与c/c是不同的。 1. while循环 (1) 语法格式 while <condition>&#xff1a;...# demo, 使用while循环累加1-100的和。 sum 0 counter 1 while counter < 100:sum counterco…

Java 23种设计模式(4.创建者模式-建造者模式)

代码分析 结构图 代码 public class Product {//产品类,多个部件构成List <String> parts new ArrayList<>();public void Add(String part){parts.add(part);}public void show(){System.out.println("creat parts");for(String part:parts){System…

第十届蓝桥杯省赛 C++ B/C组 - 等差数列

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;等差数列 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…

STL分析(九 适配器)

容器适配器&#xff1a;stack&#xff0c;queue stack和queue内含一个deque 函数适配器 binder2nd绑定第二参数 调用的过程中&#xff0c;算法count_if函数读取了迭代器头尾指针后&#xff0c;读取第三个参数为functor object即仿函数。因此在其参数为bind2nd(less< int&g…

LeetCode220123_140、117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL。初始状态下&#xff0c;所有 next 指针都被设置为 NULL。进阶…

双指针思想,c语言

问题导入 对一个给定的自然数M&#xff0c;求出所有的连续的自然数段&#xff0c;这些连续的自然数段中的全部数之和为M。 例如&#xff1a;1998 1999 2000 2001 2002 10000&#xff0c;所以从1998到2002的一个自然数段为M 10000的一个解。 输入格式 第一行&#xff0…

JQuery总结(三)

jQuery 事件 on可以同时绑定多个事件&#xff0c;并且动态添加的元素也会自动添加事件 自动触发事件&#xff1a; 案例1&#xff1a; <style>div{width: 100px;height: 200px;background-color: violet;transition: all .5s;}.current{width: 200px;height: 100px;ba…

ARP渗透与攻防(三)之流量分析

ARP攻击-流量分析 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 系列文章 1.环境准备 1.kali作为攻击机 2.win10作为靶机 IP地址&#xff1a;192.168.110.11 3.网关 IP地址&#xff1a;192.168.110.1 2.kali数据包转发 出于安全考虑&#xff0c;Linux系统默…

使用Py6S计算瑞利反射率教程

1、前言那么&#xff0c;首先&#xff0c;什么是瑞利反射率&#xff1f; 好吧&#xff0c;这是由大气中的瑞利散射引起的反射率&#xff08;在大气层顶部测量&#xff09;。 这是大气中气体分子对光的波长依赖性散射——这是光穿过大气时不可避免的结果。所以&#xff0c;关于如…

【2022年度总结与2023展望】---22年故事不长,且听我来讲

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f4e3;系列专栏&#xff1a;故事 文章目录前言一、高考前及高考后的暑假二、大一上的生活2.1 感受校园美景2.2 进入ACM实验室2.3 比赛和比赛经历三、那些帮助过我的人…

AlmaLinux 9 安装Oracle GraalVM Enterprise Edition 22.3.x

今天我们尝试一下在AlmaLinux 9 安装Oracle GraalVM Enterprise Edition 22.3.x。 GraalVM Enterprise 22是包含新功能的最新版本&#xff0c;但不是Long-Term-Support (LTS) 版本。 注意&#xff1a;下载Oracle GraalVM Enterprise Edition需要有Oracle账户&#xff0c;如果没…

六、pyhon操作mysql篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. 下载pymysql 2. 新建数据库 3. mysql服务器版本查询 4. 执行非查询性质的SQL 5. 执行查询性质的sql ​​​​​​​6. 执行新增sql 1. 下载pymysql 右下角点击版本 选择解释器设…

基于Markdown文件的个人wiki

节后第一更&#xff0c;老苏祝您兔年大吉&#xff0c;幸福安康&#xff0c;事事顺心&#xff01; 什么是 wikmd &#xff1f; wikmd 是一个基于文件的 wiki&#xff0c;旨在简化。这些文档完全用 Markdown 编写&#xff0c;使用 pandoc 将 Markdown 文件转换为 html5。 &#…

WPF__Viewport3D 学习记录

1、相机的摆放位置和姿态 Position 是指定照相机的位置&#xff0c;注意Z轴的坐标&#xff0c;如果Z轴值大于模型的Z轴值&#xff0c;那么镜头就在物体前面&#xff0c;反之在物体后面。因此&#xff0c;你可以设置 LookDirection 来调整相机的方向&#xff0c;Position是相机的…

NodeJS 之模块化

NodeJS 之模块化参考描述模块化优点分类加载模块作用域优点自定义模块modulemodule.exportsexports 与 module.exports示例示例一示例二示例三建议CommonJS规范CommonJS参考 项目参考搜索引擎Bing哔哩哔哩黑马程序员 描述 项目描述操作系统Windows 10 专业版NodeJS18.13.0 模…