面试部分梳理 - JVM
- 学习网址
- 网址的公众号:JavaGuide
随看随记
- [栈与栈帧]
- Java虚拟机栈–栈帧
- java逃逸技术分析
- TLAB对象创建
- 详解 JVM Garbage First(G1) 垃圾收集器
运行时数据区域
程序计数器
- 程序计数器主要有两个作用:(解释 + 保存)
- 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
- 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
- 程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡
Java 虚拟机栈
- Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)
- 局部变量表主要存放了编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
- Java 虚拟机栈会出现两种错误:StackOverFlowError 和 OutOfMemoryError。
- StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。
- OutOfMemoryError: Java 虚拟机栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
栈帧
- 每个栈帧都存储着
- 局部变量表(Local Variables)
- 操作数栈(Operand Stack)(或表达式栈)
- 动态链接(Dynamic Linking)
- 方法返回地址(Return Adress)(或方法正常退出或者异常退出的定义)
- 一些附加信息
- Java虚拟机栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。
- Java 方法有两种返回方式:
- return 语句。
- 抛出异常。
- 不管哪种返回方式都会导致栈帧被弹出
本地方法栈
- 和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
- 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。
- 方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种错误。
堆
- Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
- java逃逸分析是指判断一个对象会不会在其他地方共有,如果不需要就会直接放到栈中,减小堆的压力,方便GC。
- Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代;再细致一点有:Eden、Survivor、Old 等空间。进一步划分的目的是更好地回收内存,或者更快地分配内存。
- 在 JDK 7 版本及 JDK 7 版本之前,堆内存被通常分为下面三部分:
- 新生代内存(Young Generation)
- 老生代(Old Generation)
- 永久代(Permanent Generation)
- 下图所示的 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。
- JDK 8 版本之后 PermGen 已被 Metaspace(元空间) 取代,元空间使用的是直接内存。
- 大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。
-
面试部分梳理 - JVM相关推荐
- 2019年秋招 Java 面试知识点梳理(高频问题)
Java 面试知识点梳理 基础一 JVM-内存区域分配 HotSpot 对象创建 JVM-类加载机制 JVM-内存分配(堆上的内存分配) JVM-GC回收机制 JVM-垃圾收集器 JVM指令重排序 重 ...
- 浮点数例外 (核心已转储)_15000 字梳理 JVM 的核心知识
前言 随着cpu运行速度的提高和内存的增大,我们的应用程序的用户响应时间和系统吞吐量也发生了质的提高.但是只有硬件设备的提高是不行的,软件的性能和运行在硬件上的虚拟机的各项参数都影响着系统的质量.在越 ...
- 【持续..】WEB前端面试知识梳理 - CSS部分
传送门: WEB前端面试知识梳理 - CSS部分 WEB前端面试知识梳理 - JS部分 最近在看大厂的一些面试题,发现很多问题都是平时没有在意的,很多知识都是知道一点但又很模糊说不出个所以然来,反思自 ...
- BATJ面试必会|Jvm 虚拟机篇
转载自 BATJ面试必会|Jvm 虚拟机篇 目录 一.运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二.垃圾收集 判断一个对象是否可被回收 引用类型 ...
- 【PHP 面试知识梳理】
PHP 面试知识梳理 算法与数据结构 BTree和B+tree BTree B树是为了磁盘或者其他存储设备而设计的一种多叉平衡查找树,相对于二叉树,B树的每个内节点有多个分支,即多叉. 参考文章:ht ...
- 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘
本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...
- 面试篇之JVM(GC 可达性分析 回收算法 卡表 G1)
面试篇之JVM 面试篇之JVM GC 对象存活判断 分代回收理论 常见回收算法 HotSpot实现细节 记忆集与卡表 读写屏障 回收器 并发标记 G1 面试篇之JVM GC 美团 1.JVM怎么判断一 ...
- 一小时让你Get到面试套路:记一次Java初中级程序员面试流程梳理
视频教程传送门: 一小时让你Get到面试套路:记一次Java初中级程序员面试流程梳理_哔哩哔哩_bilibili听了N多个师兄师姐的面试录音,采访了N多个师兄时间的面试经历,才总结出来的java面试流 ...
- 《面试补习》- JVM知识点大梳理
概述 1.什么是虚拟机? Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class ). 跨平台的是 Java 程 ...
最新文章
- 非计算机专业如何转行AI,找到算法offer?
- 033_字符集和编码
- 这年头,老赖没得混了!大数据式追债,你见过吗?
- Java - 探究前后分离带来的跨域问题
- Scott用户的表结构
- 跨域会报40几_关于跨域,以及跨域的几种方式
- 字符串匹配算法_4月16日活动预告|字符串匹配算法解析
- 【debug】写应用程序时遇到的桌面图标、运行图标、背景图片问题
- 热敏电阻如何查表计算温度_额温枪温补算法:热电堆温度补偿算法 MTP10B7F55
- H5 FileReader对象
- LoadRunner 12 发布,主推云
- 数据库设计的几个建议
- Bias and Variance with Mismatched Distributions
- Linux(Ubuntu)上的VULKAN环境配置步骤记录
- 西门子plc语句表是c语言吗,三菱、西门子PLC常用语句表,速来收!
- 计算机u盘设备无法启动不了怎么办,U盘无法弹出说正在占用怎么办?Windows无法停止设备解决方法...
- 常用应用服务器——Tomcat的常用小技巧
- Vue中@click.stop与@click.prevent、@click.native
- Cadence OrCAD Capture 修改添加阵列PIN的递增方向的方法
- 燕郊手机5G网络已全面覆盖,宽带提高至1000M!
热门文章
- 2019年秋招 Java 面试知识点梳理(高频问题)