JVM的各种细节

devtools/2025/3/18 2:37:18/

(1)JVM 核心结构(必须知道)

  1. 类加载器

    • 负责将.class()文件加载到内存中,供 JVM 使用。

  2. 方法区

    • 存储类元数据(类名、字段、方法)、常量池、静态变量等。

    • JDK 8+:由元空间(Metaspace)替代,使用本地内存。

  3. Java 堆

    • 所有线程共享的内存区域,存放对象实例和数组。

    • 分代管理(新生代、老年代),通过垃圾回收自动清理。

  4. Java 栈

    • 线程私有内存,存储方法调用的栈帧(局部变量、操作数栈、动态链接)。

    • 常见异常:栈溢出(StackOverflowError)。

  5. 直接内存

    • 非堆内存,直接使用系统物理内存(如 NIO 缓冲区)。

    (2)JVM中的垃圾回收机制

    新生代回收(复制算法)
    • 策略:将内存划分为两个大小相等的区域(Eden 区 + 2 个 幸存者区)。

    • 流程:

      1. 对象优先分配到 Eden 区,当 Eden 区满时触发 新生代垃圾回收。

      2. 存活对象被复制到其中一个 幸存者区,清空 Eden 和另一个 幸存者区。

      3. 后续 GC 中,存活对象在 From(烦) 区和 To(tu) 区之间复制,直到达到默认临界值(如 15 次)后进入老年代。

    老年代回收(标记 - 整理算法)
    • 策略:当老年代内存不足时触发 Full GC。

    • 流程:

      1. 标记所有存活对象。

      2. 将存活对象向一端移动,清理边界外的内存。

      3. 若回收后仍无足够空间,抛出内存溢出错误`。

      (3)垃圾回收机制是什么

    JVM 通过分代策略和不同引用类型的处理,高效管理内存。理解新生代与老年代的回收差异,以及引用类型对对象生命周期的影响,是优化 Java 程序性能的关键。

    • 强引用:默认引用,对象必须被显式释放才会被回收。

    • 软引用:内存不足时触发回收(适用于缓存场景)。

    • 弱引用:GC 时立即回收(如 ThreadLocal 的 Entry)。

    • 虚引用:仅用于跟踪对象是否被回收,无法通过虚引用获取对象。

      (4). 垃圾回收算法**

      标记 - 清除算法
      • 步骤:标记存活对象 → 清除未标记对象。

      • 缺点:产生内存碎片,影响后续分配效率。

      复制算法
      • 步骤:将存活对象复制到另一块空间 → 清空原空间。

      • 适用场景:新生代(对象存活率低)。

      • 优点:无内存碎片,速度快;缺点:需双倍内存。

      标记 - 整理算法
      • 步骤:标记存活对象 → 将存活对象向一端移动 → 清除边界外的内存。

      • 适用场景:老年代(对象存活率高)。

      • 优点:减少内存碎片。

(5)什么是内存溢出?什么是内存泄露?

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。

内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽

略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

(6)JVM 性能调优核心参数(精简版)

1. 堆内存配置
  • -Xmx:设置堆内存最大限制(如-Xmx8g)。 关键作用:避免因内存不足导致 OOM。

2. 新生代参数
  • -XX:NewSize:初始新生代大小(建议与-XX:MaxNewSize一致)。

  • -XX:NewRatio:新生代与老年代内存比例(默认 2,即新生代占 1/3)。

  • -XX:SurvivorRatio`**:Eden 区与单个 幸存者区的比例(默认 8)。

3. 垃圾回收器选择
区域参数适用场景
年轻代-XX:+UseParNewGC多线程,低延迟
老年代-XX:+UseConcMarkSweepGC并发回收,适合 Web 应用

(7)接口中新增了什么属性

1、默认方法 Java8允许接口中包含具体实现的方法体,该方法是默认方法,它需要使用默认关键字修饰 2、静态方法 Java8中允许接口中定义静态方法,使用静态关键字修饰


http://www.ppmy.cn/devtools/167969.html

相关文章

提升 React 应用性能:使用 React Profiler 进行性能调优

前言 在现代前端开发中,性能优化是一个不可忽视的重要环节。在 React 生态系统中,React Profiler 是一个强大的工具,它可以帮助我们检测和优化应用的性能。 本文将通过通俗易懂的语言介绍 React Profiler 的作用,并展示如何使用它…

网络爬虫【简介】

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 一、网络爬虫的定义 网络爬虫(Web Crawler),又称为网络蜘蛛、网络机器人等,是一种按照一定规则自动抓取互联网信息的程序或脚本。它…

深入解析淘宝商品描述接口 item_get_desc:获取商品详情的高效工具

在电商领域,商品描述是连接卖家与买家的重要桥梁。它不仅展示了商品的特性、功能和使用方法,还能直接影响消费者的购买决策。为了帮助开发者和商家更好地获取淘宝商品的详细描述信息,淘宝开放平台提供了 item_get_desc 接口。本文将详细介绍该…

CMD批处理一些冷门命令,编写windows脚本常用?

场景1: 考虑一种情况,需要使用变量对变量循环替换这个时候,如果不加以一些特殊的设置,很有可能出现与预设的结果不相符的情况,这个时候可以通过设置这样一个命令来避免这个问题。 解决方式: setlocal ena…

鸿蒙 Next 实现单例

鸿蒙 Next 实现单例 在鸿蒙 Next 开发中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。本文将详细介绍如何在鸿蒙 Next 中实现单例模式,并提供几种常见的实现方式。 一、单例模式的实现方式…

自动化测试 | Python+PyCharm+Google Chrome+Selenium 环境安装记录

目录 环境版本 浏览器与驱动 Python 安装 测试 PyCharm 安装 开启软件 开始破解 Selenium 安装 测试 自动化的其实就是模拟手工点击的方式 环境版本 Python:3.11.8 PyCharm:2021.1.3 Selenium:x.x 浏览器与驱动 114.0.5735.90 …

Django部署Filemanagement

Pycharm搭建项目安装虚拟环境 mysqlclient对mysql的安装,配置有要求 pymsql伪装成mysqlclient,pymysql可以操纵mysql pip install pymysql操作sql5.7 mysql8.0会出现与pycharm不兼容问题,会报错,所以降到5.7 # 进入mysql 需要…

Chrome 扩展开发 API实战:Tabs(九)

1. 引言 本文为您提供 chrome.cookies API 的全面指南,包括其功能、使用方法以及详细示例。无论您是初学者还是经验丰富的开发者,这篇文章都能帮助您高效管理和操作 Chrome 扩展中的 cookies。 2. 权限声明 在 manifest.json 文件中声明所需的权限&am…