直击面试

反正我是带着这些问题往下读的

  • 说一下 JVM 运行时数据区吧,都有哪些区?分别是干什么的?
  • Java 8 的内存分代改进
  • 举例栈溢出的情况?
  • 调整栈大小,就能保存不出现溢出吗?
  • 分配的栈内存越大越好吗?
  • 垃圾回收是否会涉及到虚拟机栈?
  • 方法中定义的局部变量是否线程安全?

运行时数据区

内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。

下图是 JVM 整体架构,中间部分就是 Java 虚拟机定义的各种运行时数据区域。

jvm-framework

Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。

  • 线程私有:程序计数器、栈、本地栈
  • 线程共享:堆、堆外内存(永久代或元空间、代码缓存)

下面我们就来一一解毒下这些内存区域,先从最简单的入手

一、程序计数器

程序计数寄存器(Program Counter Register),Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的线程信息,CPU 只有把数据装载到寄存器才能够运行。

这里,并非是广义上所指的物理寄存器,叫程序计数器(或PC计数器或指令计数器)会更加贴切,并且也不容易引起一些不必要的误会。JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器

1.1 作用

PC 寄存器用来存储指向下一条指令的地址,即将要执行的指令代码。由执行引擎读取下一条指令。

jvm-pc-counter

(分析:进入class文件所在目录,执行javap -v xx.class反解析(或者通过IDEA插件Jclasslib直接查看,上图),可以看到当前类对应的Code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等信息。)

1.2 概述

  • 它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域
  • 在 JVM 规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期一致
  • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。如果当前线程正在执行的是 Java 方法,程序计数器记录的是 JVM 字节码指令地址,如果是执行 natice 方法,则是未指定值(undefined)
  • 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
  • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
  • 它是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域

:使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?

♂️:因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。

:PC寄存器为什么会被设定为线程私有的?

♂️:多线程在一个特定的时间段内只会执行其中某一个线程方法,CPU会不停的做任务切换,这样必然会导致经常中断或恢复。为了能够准确的记录各个线程正在执行的当前字节码指令地址,所以为每个线程都分配了一个PC寄存器,每个线程都独立计算,不会互相影响。


二、虚拟机栈

2.1 概述

Java 虚拟机栈(Java Virtual Machine Stacks),早期也叫 Java 栈。每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次 Java 方法调用,是线程私有的,生命周期和线程一致。

作用:主管 Java 程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

特点:

  • 栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器
  • JVM 直接对虚拟机栈的操作只有两个:每个方法执行,伴随着入栈(进栈/压栈),方法执行结束出栈
  • 栈不存在垃圾回收问题

栈中可能出现的异常:

Java 虚拟机规范允许 Java虚拟机栈的大小是动态的或者是固定不变的

  • 如果采用固定大小的 Java 虚拟机栈,那每个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常
  • 如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常

可以通过参数-Xss来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。

2.2 栈的存储单位

栈中存储什么?

  • 每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在
  • 在这个线程上正在执行的每个方法都各自有对应的一个栈帧
  • 栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息

2.3 栈运行原理

  • JVM 直接对 Java 栈的操作只有两个,对栈帧的压栈出栈,遵循“先进后出/后进先出”原则
  • 在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈帧对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)
  • 执行引擎运行的所有字节码指令只针对当前栈帧进行操作
  • 如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,称为新的当前栈帧
  • 不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧中引用另外一个线程的栈帧
  • 如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧
  • Java 方法有两种返回函数的方式,一种是正常的函数返回,使用 return 指令,另一种是抛出异常,不管用哪种方式,都会导致栈帧被弹出

读者福利

读到这的朋友还可以免费领取一份收集的Java进阶知识笔记和视频资料。

资料免费领取方式:关注后,点击这里即可免费领取

更多笔记分享

Aq-1625121280501)]

更多笔记分享

[外链图片转存中…(img-yMOJoJyp-1625121280504)]

[外链图片转存中…(img-SMTHSVRV-1625121280506)]

34岁程序员年薪50w,java工程师转正答辩相关推荐

  1. 35岁程序员:西安Java工程师培训

    美团面试经历(还原最真实的4面) 美团一面: 1.自我介绍 2.聊项目相关 介绍项目 怎么保证redis与Mysql的数据一致性 见你写了个加随机数预防缓存雪崩,解释一下 未改进和改进后的Jmter测 ...

  2. 34岁程序员面试被拒:混得好的年轻人都有这3个特质

    34岁程序员面试被拒:混得好的年轻人都有这3个特质 前几天我参加了一场闭门创业营,很多大佬分享了很多干货和经验,但是最打动我的,还是其中一位前辈分享的故事--"如何判断一个员工是否有潜力&q ...

  3. 34岁程序员面试美团被拒绝:只招30岁以下,卖力能加班工资又少的

    导读: 在传统行业,年龄越大可以说是越受欢迎,毕竟工作经验多,新人很难独当一面:而互联网行业刚好相反,年龄越大越不受重用,还可能连工作都不好找.原因也很简单,那就是互联网技术更新速度太快了,经验的作用 ...

  4. 34岁程序员本年薪50w,疫情被裁半年考入编制内月薪6K,他却说:真香!

    01 34岁的年纪,在正常情况下来说绝谈不上"高龄".但是在程序员这个特殊的行业来说,34岁已经是临近退休的年龄了. 泽林今年已经34岁了,原本是一名Android移动应用开发高级 ...

  5. 某34岁程序员求助:从美团L7跳到阿里P7,涨薪30%,去不去?

    互联网圈子里盛传美团的卷文化师从阿里,但青出于蓝而胜于蓝,事实是否如此呢? 一个程序员分析美团和阿里的区别,总结了以下内容: 美团: 1.必开早会,周会,月会,质量总结会 2.周报必须写思考 3.半年 ...

  6. 某34岁程序员哀叹:北京有一套房和160万现金,但500万的股票缩水到70万,上周刚失业,今天跟女友分手,心态崩了!...

    在如今的互联网寒冬里,身处其中的打工人是什么处境呢? 来看看一个中年互联网人的故事:34岁,北京一套房,160万现金,原本500万的中概股现在缩水到70万.谈了一个90年的女友今天分手了,上周又刚失业 ...

  7. 30岁转行程序员,华为java工程师工资

    有赞: 一面 hashMap原理,put和resize过程 线程池有哪些类型, concurrentHashMap分段锁原理,java8和java7实现的区别 B-树和B+树区别,数据库索引原理,组合 ...

  8. 42岁程序员面试,java书籍入门下载

    一面 1. 二叉搜索树和平衡二叉树有什么关系,强平衡二叉树(AVL 树)和弱平衡二叉树 2. B 树和 B+树的区别,为什么 MySQL 要使用 B+树 3. HashMap 如何解决 Hash 冲突 ...

  9. java工程师转正答辩,面试经历分享

    直击面试 反正我是带着这些问题往下读的 说一下 JVM 运行时数据区吧,都有哪些区?分别是干什么的? Java 8 的内存分代改进 举例栈溢出的情况? 调整栈大小,就能保存不出现溢出吗? 分配的栈内存 ...

  10. 事业编还是程序员_34岁程序员月薪3万2,跳槽被国企录取,看到月收入后却犹豫了!...

    ​​互联网行业在这几年也算是非常火了吧.虽然国内互联网的发展已经有几十年的时间了.但真正全方位的应用,还只是在这十多年的时间里,因为对计算机人才的要求越来越多,薪资待遇也变得越来越出色了.在这样的情况 ...

最新文章

  1. Linux中的文件复制:cp和scp
  2. 创建自己的CA机构 - openssl cert 双向认证
  3. xcode4自定义文件模板(Creating Custom Xcode 4 File Templates)
  4. QT的QDomElement类的使用
  5. linux openh264 编译,在Linux下为Android构建openh264
  6. linux重定向输出命令
  7. C++ 程序员自信心曲线图
  8. Sunscreen(POJ-3416)
  9. js 数组头部添加_javaScript 为对象型数组创建表格
  10. 协助数据库完成大数据实时查询
  11. 计算机网络管理员试题实操,网络管理员试题(实操).doc
  12. 数字货币期货生存指南
  13. IK分词器结合ES使用
  14. javaFX 学习之 超链接(HyperLink) 转载
  15. tc7102路由器虚拟服务器,国内电信推首款WiFi 6+路由器TC7102,5G和WiFi 6成黄金搭档-贤集网...
  16. Redis 缓存穿透、击穿、雪崩 解决方法
  17. 桌面计算机不显示桌面,电脑不显示桌面怎么办,电脑无法显示桌面
  18. 硬核内网穿透,NAS变网盘
  19. Unity使用设置界面Slider控制音量,场景切换时音量滑条都不改变
  20. iPhone手机屏幕尺寸与倍图计算公式

热门文章

  1. 《像混球那样思考和行动》
  2. 温州计算机职称考试成绩查询,职业资格证书可上网查询认证
  3. ES6的新特性,前端必看知识点
  4. MQTT如何快速助你产品化
  5. 网站接入qq客服在线聊天
  6. 小米人APK改之理(APK IDE)
  7. 将声音也输出到耳机(by quqi99)
  8. 频谱分析仪的作用是什么?TFN FAT811手持式频谱分析仪
  9. 用手持式频谱分析仪进行干扰检测
  10. 华为获颁中国首个5G基站设备进网许可证:可支持中国规模部署;IBM推出新一代企业平台Z15;Testin最新AI产品发布……...