当前位置: 首页 > news >正文

面试题-谈谈你对JVM的理解

首先问一个问题,jvm、jdk、jre三者的区别?再去谈其他的

  • JVM(Java Virtual Machine):虚拟机 ,源文件.java在虚拟机中通过编译器编译成字节码文件.class,是整个java实现跨平台的最核心的部分 操作系统
  • JRE(java Runtime Environment):即java运行环境,作用是运行别人写好的程序(JRE并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。) 运行环境
  • JDK(Java Development Kit):开发工具即很多开发时使用到的工具如javac.exe编译工具和java.exe执行工具。我们可以到JDK目录下的bin目录下找到它,它的名称为:javac.exe 开发工具

三者的关系是JDK包含JRE包含JVM,Java运行步骤:源码—>javac编译器—>字节码文件—Java解释器—>机器码文件。
jvm的作用是将字节码文件解释为机器码文件。
源码通过javac编译器转化为字节码文件,字节码文件是一样的。不一样的是jvm,针对不同的系统有不同的 jvm 实现。

JVM的全称是叫Java虚拟机,看下面一张图

从这张图中看出,JVM所处的位置以及他有两个作用。

第一个作用:运行并管理Java源码文件,所生成的class文件;

第二个作用:在不同的操作系统上,安装不同的JVM,从而去实现跨平台的保障

JVM是运行在操作系统上的

解释名词

程序计数器

程序计数器是一块较小的内存区域,作用可以看作是当前线程执行的字节码的位置指示器。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的.分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖于这个计算器来完成。

方法区

与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

Java 栈
栈也叫栈内存,主管 Java 程序的运行,是在线程创建时创建,它的生命周期是跟随线程的声明周期,线程结束栈内存也就释放了,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就 Over,生命周期和线程一致,是线程私有的。8 种基本类型的变量 + 对象的应用变量 + 实例方法都是在函数的栈内存中分配

栈存储什么?
栈帧中主要保存 3 类数据:

  • 本地变量(Local Variables):输入参数和输出参数以及方法内的变量
  • 栈操作(Operand Stack):记录出栈、入栈的操作
  • 栈帧数据(Frame Data):包括类文件、方法等

Heap 堆
Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆

堆内存分为三个部分

  • Young Generation Space 新生区 Young / New
  • Tenure Generation Space 老年区 Old / Tenure
  • Permanent Space 永久区 Perm

相关文章:

  • 面试时Dubbo原理记不住?来看看《Dubbo原理浅析——从RPC本质看Dubbo》
  • 开源治理:安全的关键
  • 什么是快应用?与原生APP相比优势在哪里
  • 卷积神经网络结构有哪些,卷积神经网络结构特点
  • 阿里内部首发面试终极指南V3.0,相对一线大厂面试知识点+面试题
  • vue路由原理
  • idea常用快捷键和插件
  • 04_feign介绍(OpenFeign)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • 长安链源码学习v2.2.1--ioc机制(九)
  • 面试必备:《Java 最常见 200+ 面试题全解析》
  • 抖音短视频运营规划内容孵化计划书模板
  • Leetcode 946.验证栈序列
  • CREO:利用CREO软件实现装配设计之四连杆机构设计案例应用(图文教程)之详细攻略
  • 基于数字孪生的智慧城市是如何发展的?
  • 【剑指offer】让抽象问题具体化
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android 架构优化~MVP 架构改造
  • Debian下无root权限使用Python访问Oracle
  • java8 Stream Pipelines 浅析
  • js对象的深浅拷贝
  • Meteor的表单提交:Form
  • Rancher如何对接Ceph-RBD块存储
  • React的组件模式
  • Sass 快速入门教程
  • Terraform入门 - 1. 安装Terraform
  • uni-app项目数字滚动
  • Vue 动态创建 component
  • Zsh 开发指南(第十四篇 文件读写)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 构建二叉树进行数值数组的去重及优化
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 消息队列系列二(IOT中消息队列的应用)
  • 进程与线程(三)——进程/线程间通信
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​业务双活的数据切换思路设计(下)
  • (07)Hive——窗口函数详解
  • (function(){})()的分步解析
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (四)汇编语言——简单程序
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转) Android中ViewStub组件使用
  • (转)Oracle存储过程编写经验和优化措施
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)OpenStack Hacker养成指南
  • .aanva
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net framework4与其client profile版本的区别
  • .net mvc 获取url中controller和action
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)