avatar
文章
38
标签
40
分类
29
首页
归档
标签
分类
Zhongzheng's Blog
搜索
首页
归档
标签
分类

Zhongzheng's Blog

JVM通关指南(六)深入分析JVM的堆内存(附高频面试QA)
发表于2025-07-13|JVM
JVM堆内存Java虚拟机(JVM)的堆内存(Heap)是Java程序运行时数据区中最大的一块,被所有线程共享。堆内存主要用于存放对象实例和数组,是垃圾收集器(GC)管理的主要区域。 堆内存特点 由JVM启动时创建 大小可以固定也可以动态调整 物理上可以不连续但逻辑上要连续 线程共享,需要考虑线程安全问题 自动内存管理(GC) 堆内存结构123456Young Generation (新生代)├── Eden Space (伊甸园区)├── Survivor Space 0 (幸存者0区)└── Survivor Space 1 (幸存者1区)Old Generation (老年代)(可选) Permanent Generation / Metaspace (永久代/元空间) 新生代(Young Generation) 存放新创建的对象 分为Eden区和两个Survivor区(S0, S1) 大多数对象在这里被创建和销毁 使用复制算法进行垃圾回收(Minor GC) 老年代(Old Generation) 存放长期存活的对象 从新生代晋升过来的对象...
JVM通关指南(五)类加载器 - 了解Java类是如何加载
发表于2025-07-13|JVM
JVM的类加载器JVM的类加载器类加载器(ClassLoader)是JVM的核心组件之一,负责将.class文件加载到JVM,但从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。 类加载器的层次结构Bootstrap ClassLoader(启动类加载器) 最顶层的类加载器 负责加载JAVA_HOME/lib目录下的核心类库 由C++实现,是JVM的一部分 Extension ClassLoader(扩展类加载器) 负责加载JAVA_HOME/lib/ext目录下的扩展类库 由Java实现,是sun.misc.Launcher$ExtClassLoader类 Application ClassLoader(应用程序类加载器) 也称为System ClassLoader...
JVM的通关指南(四)五分钟了解JVM的垃圾收集器
发表于2025-07-13|JVM
JVM垃圾收集器Java虚拟机(JVM)的垃圾收集(GC)是自动内存管理的核心机制,理解不同的垃圾收集器及其工作原理对于编写高性能Java应用至关重要。 常见垃圾收集器 Serial收集器特点: 单线程收集器 新生代使用标记-复制算法 老年代使用标记-整理算法 适合客户端应用或小内存环境 启用参数: 1-XX:+UseSerialGC 代码示例: 1234567891011public class SerialGCExample { public static void main(String[] args) { // 模拟产生大量临时对象 for (int i = 0; i < 1000000; i++) { String temp = new String("Object-" + i); if (i % 10000 == 0) { System.gc(); // 建议JVM执行GC ...
JVM通关指南(三)吃透JVM的垃圾回收机制 - GC
发表于2025-07-13|JVM
垃圾回收垃圾回收(Garbage Collection, GC)是JVM自动管理内存的机制,负责回收不再使用的对象占用的内存空间。Java开发者不需要手动释放内存,这大大减少了内存泄漏和指针错误的风险。 为什么需要垃圾回收 防止内存泄漏 避免手动内存管理的复杂性 提高开发效率 保证程序稳定性 垃圾回收的基本原理对象存活判断引用计数法(Java未采用)1234567891011121314class Object { int refCount = 0; void addReference() { refCount++; } void removeReference() { refCount--; if (refCount == 0) { // 可以被回收 } }} 可达性分析算法(Java采用)从GC Roots对象开始,向下搜索引用链,不在引用链上的对象被视为可回收。 GC Roots包...
JVM通关指南(二)JVM运行时数据区的深入解析
发表于2025-07-13|JVM
JVM运行时数据区JVM运行时数据区是Java虚拟机在执行Java程序时使用的内存区域,它被划分为几个不同的部分,每个部分有特定的用途,下面是JVM运行时数据区主要组成部分。 方法区(Method Area) 线程共享的内存区域 存储已被JVM加载的:类信息、常量、静态变量、即时编译器编译后的代码 在HotSpot JVM中也被称为”永久代”(PermGen),但在Java 8中被”元空间”(Metaspace)取代 当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常 Java堆(Java Heap) 线程共享的内存区域 在JVM启动时创建 存储所有对象实例和数组 GC管理的主要区域(“GC堆”) 内存回收角度来看java堆可分为:新生代和老生代。 堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常 程序计数器(Program Counter Register) 线程私有的内存区域 记录当前线程所执行的字节码行号指示器 执行Java方法时记录正在执行的虚拟机字节码指令地址 执行Native方法时值为...
JVM通关指南(一)原来这就是JVM
发表于2025-07-13|JVM
Hi,JVM的通关指南系列文章可以让大家从0-1认识JVM,从字节码的隐秘舞步,到垃圾回收的时空艺术,从类加载的双亲委派玄机,到JIT编译器的性能黑科技,我们一起穿透JVM的迷雾。本文章将对JVM的内容做一个概述,后续会分别详细分析各知识模块(运行时数据区、内存结构、垃圾回收机制、垃圾收集器、参数配置、JVM可视化工具等)。 JVMJVM:Java Virtual Machine,是Java程序的核心运行环境,主要工作是解释字节码并映射到本地的CPU指令集和OS系统调用,JVM屏蔽了与操作系统平台的相关信息,使Java程序无需进行修改就可以在多种不同平台上运行,即”一次编译,到处运行“。 JDK、JRE 和 JVM的区别JVM:执行编译后的 Java 字节码(.class 文件),实现跨平台特性,一次编写,到处运行。 JRE:为运行 Java 程序提供必要环境(包含 JVM + 基础类库) JDK:提供完整的 Java 开发环境(包含 JRE + 开发工具) 包含关系:JDK ⊃ JRE ⊃ JVM 三者的类比说明JVM 像汽车的发动机(负责执行) JRE 是发动机 + 油...
40亿QQ号,给你1G内存,怎么去重?
发表于2025-07-12
给你40亿个QQ号,要求相同的QQ号码仅保留一个,内存限制为1个G,你会怎么实现? 这其实就是个经典的海量数据去重问题,而且还附带一个让人头疼的条件:内存限制只有1G! 理解题目:从QQ号和内存限制说起我们先来分析一下问题本身。 QQ号其实是一串数字,范围是4字节的无符号正整数,也就是32位,理论上最大值接近43亿。所以,如果单纯存储这40亿个QQ号,需要耗费多少内存呢? 简单计算一下: 14000000000*4 /1024/1024/1024 ≈ 15GB 总共需要15GB的内存,显然远远超过了题目给的1GB限制。这就需要我们换个思路,不能“硬塞”,要想办法巧妙地存储和处理这些QQ号。 所以问题的本质就是“在内存非常有限的情况下,高效实现重复数据的去重”。 解决方案有很多,但是主流的方案有两种: 方案1:使用Bitmap 方案2:使用布隆过滤器 两者各有千秋,但在本题中,我们使用BitMap更加合适。 解决方案:用BitMap的精妙之处化繁为简什么是BitMap?所谓位图(BitMap)其实就是一个bit数组,即每一个位置都是一个bit,其中的取值可以是0或者1。 通俗...
什么是缓存一致性问题,如何解决分布式缓存一致性问题?
发表于2024-08-14|分布式分布式缓存
什么是缓存?将数据源的数据存储到内存中,快速响应请求数据的一种手段。同时缓解了对数据库频繁读写的压力。 什么是分布式缓存?分布式缓存是一种将数据分散到不同的机器上进行存储,方便快速响应请求的一种手段。区别于以往的单机存储,将数据存储在单一的服务器上。 分布式缓存的优点是什么? 提高了单机缓存的容量限制单机缓存受限于一台机器的硬件资源,当数据缓存量庞大时,无法满足容量要求。 解决了单机缓存的单点问题单机缓存由于只有一台机器进行对外提供服务,一旦发生服务器故障或者程序问题,会导致无法争取提供服务,影响可用性。 提高了并发性能单机缓存受限于硬件资源(CPU、内存等)和网络资源(带宽)等,在高并发读写情况下会成为性能瓶颈。 什么是缓存一致性问题?一句话解释就是缓存中的数据和数据存储组件(例如数据库)之间的数据不一致问题。 如何解决缓存一致性问题?旁路缓存模式(Cache Aside) 读:先读取缓存数据,如果缓存中没有就访问数据存储,然后将获取的数据填充到缓存中,再返回。 写:先更新数据存储数据,再更新(删除)缓存。 优点:简单容易实现,适合读多写少的场景。 缺点:写操作时,先更...
1…34
avatar
Zhongzheng
文章
38
标签
40
分类
29
最新文章
向量的模长和勾股定理的关系是什么?2025-10-25
向量的模长是什么?2025-10-25
向量点积公式在自注意力机制中的应用?2025-10-25
向量点积为什么越大表示两个向量之间的相似度就越高?2025-10-25
BPE和tiktoken都是什么?2025-10-24
网站信息
本站总字数 :
71.9k
最后更新时间 :
© 2025 By Zhongzheng
唯一真正的智慧,是知道自己一无所知!
搜索
数据加载中