JVM组成及运行流程 - 面试笔记

JVM整体架构

JVM(Java Virtual Machine)是Java程序运行的核心环境,主要由以下几个部分组成:
JVM组成、运行流程

1. 程序计数器(Program Counter)

  • 特点:线程私有,每个线程都有独立的程序计数器
  • 作用:记录当前线程正在执行的字节码指令地址(行号)
  • 重要性:支持线程切换和恢复,确保程序能够正确执行

2. 虚拟机栈(JVM Stack)

  • 特点:线程私有,采用先进后出(LIFO)的数据结构
  • 组成:由多个栈帧组成,每个方法调用创建一个栈帧
  • 栈帧内容:局部变量表、操作数栈、动态链接、方法返回地址
虚拟机栈常见问题

垃圾回收是否涉及栈内存?
不涉及。垃圾回收主要针对堆内存,栈帧在方法执行完毕后自动弹出释放内存。

栈内存分配越大越好吗?
不是。默认栈内存通常为1024KB,过大会导致可创建的线程数减少。例如:512MB总内存,1024KB栈大小可创建512个线程,改为2048KB则只能创建256个线程。

方法内的局部变量是否线程安全?

  • 如果局部变量没有逃离方法作用范围,则线程安全
  • 如果局部变量引用了对象并逃离方法作用范围,需要考虑线程安全问题
栈内存溢出情况
  • 栈帧过多导致溢出(典型:无限递归调用)
  • 单个栈帧过大导致溢出

3. 堆内存(Heap)

  • 特点:线程共享区域,JVM中最大的内存区域
  • 作用:存储对象实例和数组
  • 异常:当堆内存不足时抛出OutOfMemoryError异常
  • 分代结构:通常分为年轻代(Eden、Survivor)和老年代

4. 方法区(Method Area)

  • 特点:线程共享的内存区域
  • 存储内容:类信息、运行时常量池、静态变量、编译后的代码
  • 生命周期:虚拟机启动时创建,关闭时释放
  • 异常:内存不足时抛出OutOfMemoryError: Metaspace
JDK版本差异

JDK 1.7 vs 1.8的重要变化:

  • JDK 1.7:存在永久代(PermGen),存储类信息、静态变量、常量等
  • JDK 1.8:移除永久代,改为元空间(Metaspace),使用本地内存,有效防止内存溢出
    JDK版本区别

5. 直接内存(Direct Memory)

  • 特点:不属于JVM内存结构,不由JVM管理
  • 本质:使用系统内存,常见于NIO操作
  • 特性:分配回收成本较高,但读写性能优秀
  • 用途:主要用作数据缓冲区
    直接内存

内存管理要点

垃圾回收机制

  • 主要针对堆内存进行回收
  • 栈内存随方法调用结束自动释放
  • 方法区在JDK 1.8后使用元空间,减少OOM风险

线程安全考虑

  • 程序计数器、虚拟机栈:线程私有,天然线程安全
  • 堆内存、方法区:线程共享,需要考虑并发访问问题
  • 直接内存:需要程序员手动管理,注意内存泄漏

面试重点

  1. 内存区域划分:能清楚说明各个内存区域的作用和特点
  2. 线程安全性:理解哪些区域是线程私有的,哪些是共享的
  3. 内存溢出:了解各种OutOfMemoryError的产生原因和解决方案
  4. JDK版本差异:特别是永久代到元空间的变化
  5. 性能调优:理解不同内存区域对性能的影响

补充知识点

常见JVM参数

  • -Xms:初始堆大小
  • -Xmx:最大堆大小
  • -Xss:栈大小
  • -XX:MetaspaceSize:元空间初始大小
  • -XX:MaxMetaspaceSize:元空间最大大小

内存泄漏常见场景

  • 长生命周期对象持有短生命周期对象的引用
  • 静态集合类引用大量对象
  • 监听器和回调函数未正确移除
  • 线程池中的线程未正确关闭

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

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

相关文章

JavaEE——线程池

目录前言1. 概念2. 线程池相关参数3. Executors的使用总结前言 线程是为了解决进程太重的问题,操作系统中进程的创建和销毁需要较多的系统资源,用了轻量级的线程来代替部分线程,但是如果线程创建和销毁的频率也开始提升到了一定程度&#xf…

3 c++提高——STL常用容器(一)

目录 1 string容器 1.1 string基本概念 1.2 string构造函数 1.3 string赋值操作 1.4 string字符串拼接 1.5 string查找和替换 1.6 string字符串比较 1.7 string字符存取 1.8 string插入和删除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector构造函数…

手把手教你用【Go】语言调用DeepSeek大模型

1、首先呢,点击 “DeepSeek”” 这个, 可以充1块玩玩。 2、然后获取api-key 3、替换apiKey const (apiURL "https://api.deepseek.com/v1/chat/completions"apiKey "your api key" // 替换为你的实际 API KeymodelName &…

自动化UI测试工具TestComplete的核心功能及应用

对桌面应用稳定性与用户体验的挑战,手动测试效率低、覆盖有限,而普通自动化工具常难以应对复杂控件识别、脚本灵活性和大规模并行测试的需求。 自动化UI测试工具TestComplete凭借卓越的对象识别能力、灵活的测试创建方式以及高效的跨平台并行执行功能&a…

【C/C++】迈出编译第一步——预处理

【C/C】迈出编译第一步——预处理 在C/C编译流程中,预处理(Preprocessing)是第一个也是至关重要的阶段。它负责对源代码进行初步的文本替换与组织,使得编译器在后续阶段能正确地处理规范化的代码。预处理过程不仅影响编译效率&…

快捷键——VsCode

一键折叠所有的代码块 先按 ctrl K,再ctrl 0 快速注释一行 ctrl /

import 和require的区别

概念 import 是es6 规范,主要应用于浏览器和主流前端框架当中,export 导出, require 是 commonjs 规范,主要应用于nodejs环境中,module.exports 导出编译规则 import 静态导入是编译时解析,动态导入是执…

8、鸿蒙Harmony Next开发:相对布局 (RelativeContainer)

目录 概述 基本概念 设置依赖关系 设置参考边界 设置锚点 设置相对于锚点的对齐位置 子组件位置偏移 多种组件的对齐布局 组件尺寸 多个组件形成链 概述 RelativeContainer是一种采用相对布局的容器,支持容器内部的子元素设置相对位置关系,适…

Linux命令的命令历史

Linux下history命令可以对当前系统中执行过的所有shell命令进行显示。重复执行命令历史中的某个命令,使用:!命令编号;环境变量histsize的值保存历史命令记录的总行数;可用echo查看一下;需要大写;环境变量hi…

【C++小白逆袭】内存管理从崩溃到精通的秘籍

目录【C小白逆袭】内存管理从崩溃到精通的秘籍前言:为什么内存管理让我掉了N根头发?内存四区大揭秘:你的变量都住在哪里?🏠内存就像大学宿舍区 🏘️C语言的内存管理:手动搬砖时代 🧱…

【网络安全】利用 Cookie Sandwich 窃取 HttpOnly Cookie

未经许可,不得转载。 文章目录 引言Cookie 三明治原理解析Apache Tomcat 行为Python 框架行为窃取 HttpOnly 的 PHPSESSID Cookie第一步:识别 XSS 漏洞第二步:发现反射型 Cookie 参数第三步:通过 Cookie 降级实现信息泄露第四步:整合攻击流程修复建议引言 本文将介绍一种…

【工具】什么软件识别重复数字?

网上的数字统计工具虽多,但处理重复数字时总有点不尽如人意。 要么只能按指定格式输入,要么重时得手动一点点筛,遇上数据量多的情况,光是找出重复的数字就得另外花不少功夫。​ 于是我做了个重复数字统计器,不管是零…

CSS分层渲染与微前端2.0:解锁前端性能优化的新维度

CSS分层渲染与微前端2.0:解锁前端性能优化的新维度 当你的页面加载时间超过3秒,用户的跳出率可能飙升40%以上。这并非危言耸听,而是残酷的现实。在当前前端应用日益复杂、功能日益臃肿的“新常态”下,性能优化早已不是锦上添花的“…

AI Agent开发学习系列 - langchain之Chains的使用(5):Transformation

Transformation(转换链)是 LangChain 中用于“自定义数据处理”的链式工具,允许你在链路中插入任意 Python 代码,对输入或中间结果进行灵活处理。常用于: 对输入/输出做格式化、过滤、摘要、拆分等自定义操作作为 LLMC…

Druid 连接池使用详解

Druid 连接池使用详解 一、Druid 核心优势与架构 1. Druid 核心特性 特性说明价值监控统计内置 SQL 监控/防火墙实时查看 SQL 执行情况防 SQL 注入WallFilter 防御机制提升系统安全性加密支持数据库密码加密存储符合安全审计要求扩展性强Filter 链式架构自定义功能扩展高性能…

9.2 埃尔米特矩阵和酉矩阵

一、复向量的长度 本节的主要内容可概括为:当对一个复向量 z\pmb zz 或复矩阵 A\pmb AA 转置后,还要取复共轭。 不能在 zTz^TzT 或 ATA^TAT 时就停下来,还要对所有的虚部取相反的符号。对于一个分量为 zjajibjz_ja_jib_jzj​aj​ibj​ 的列向…

AI驱动的低代码革命:解构与重塑开发范式

引言:低代码平台的范式转移 当AI技术与低代码平台深度融合,软件开发正经历从"可视化编程"到"意图驱动开发"的根本性转变。这种变革不仅提升了开发效率,更重新定义了人与系统的交互方式。本文将从AI介入的解构层次、交互范…

zookeeper etcd区别

ZooKeeper与etcd的核心区别体现在设计理念、数据模型、一致性协议及适用场景等方面。‌ZooKeeper基于ZAB协议实现分布式协调,采用树形数据结构和临时节点特性,适合传统分布式系统;而etcd基于Raft协议,以高性能键值对存储为核心&am…

模拟注意力:少量参数放大 Attention 表征能力

论文标题 SAS: Simulated Attention Score 论文地址 https://arxiv.org/pdf/2507.07694 代码 见论文附录 作者背景 摩根士丹利,斯坦福大学,微软研究院,新加坡国立大学,得克萨斯大学奥斯汀分校,香港大学 动机 …

零基础|宝塔面板|frp内网穿透|esp32cam远程访问|微信小程序

1.准备好阿里云服务器和宝塔面板2.安装frp服务端3.测试(密码账号在详情里面)4.配置客户端#一、没有域名情况下 [common] server_addr #公网ip地址,vps server_port 7000 服务的bind_port token 12121212 [httpname] type tcp # 没有域名情况下使用 tcp local_i…