【JavaSE】简单理解JVM

【JavaSE】简单理解JVM

目录

一、JVM内存区域划分

JVM:java虚拟机,是仿照真实的操作系统进行设计的。真实操作系统中,对于进程的地址空间是进行了区域划分的。JVM也就仿照此,也进行了区域划分的设计。

具体划分(四个核心区域):

  1. 程序计数器:一个很小的区域,只用来记录当前指令执行到哪个地址。
  2. 元数据区:保存当前类被加载好的数据(类对象 .class),Java8之前叫方法区。
  3. 栈:保存方法的调用关系。
  4. 堆:保存 new 的对象。这句代码:Test t = new Test() 代码中new Test()一定在堆中,t 是局部变量就在栈;t 是成员变量就在堆; t 是一个静态成员变量就在元数据区。

二、类加载机制

2.1 类加载的步骤

类加载的步骤:

  1. 加载:找到 .class 文件 ,根据类的全限定名(包名+类名),打开文件,读取文件内容读到内存中;
  2. 连接:
    2.1. 验证:解析,校验 .class文件的内容是否合法,并把合法内容转成结构化的数据
    2.2. 准备:给类对象申请内存空间(此处相当于全0的空间);
    2.3. 解析:针对字符串常量,进行初始化;(将 .class文件解析出的字符串常量,放到元数据区,常量池中);
  3. 初始化:将类对象进行初始化。

2.2 双亲委派模型

双亲委派模型:描述类加载中,根据全限定类名,找到.class 文件的过程。

类加载器:JVM中专门的模块,负责类加载。JVM默认提供三种类加载器(存在父子关系,1是爷,2是爸,3室儿):

  1. BootstrapClassLoader:找Java标准库的目录
  2. ExtensionClassLoader:找Java扩展库的目录
  3. ApplicationClassLoader:第三方库和当前项目的目录

过程:

  • 进行类加载的时候,通过全限定类名找.class文件时,先从ApplicationClassLoader作为入口,然后把加载类的任务交给父亲 ExtensionClassLoader,他又先给他的父亲 BootstrapClassLoader,然后 BootstrapClassLoader找Java标准库范围,找到了就加载,没找到就抛回给儿子 ExtensionClassLoader,同理进行。最后 ApplicationClassLoader都没找到,就抛出异常。

三、垃圾回收机制 (GC)

Java中释放内存(主要是针对堆上的对象)的手段。
在c语言中手动申请的内存需要手动释放,而Java引入GC会自动识别,某个内存后续是否还会使用,自动释放。

工作过程:

  1. 找到垃圾
  2. 释放垃圾

找到垃圾:
有两个方案,引用计数和可达性分析,Java采取的是可达性分析。

  1. 引用计数:给每一个对象在new的时候,搭配上一个小的内存空间,保存一个整数,表示指向这个对象的引用个数。
    1.1. 每次进行引用赋值的时候都会触发引用计数的修改,当计数为0的时候,这个对象就是垃圾了。
    1.2. 缺陷:内存消耗更多,可能出现循环引用(两个对象互相引用,引用变空,但是计数不会变为0)的问题。
  2. 可达性分析:用时间换空间,是一个周期性的过程,每隔一段时间,触发一次。
    2.1. 以代码中的一些特定对象(栈上的局部变量(引用类型的)、常量池引用指向的对象、静态成员(引用类型)),作为遍历的起点。
    2.2. 以这些特殊对象为起点,尽可能去遍历,判断某个对象是否能访问到。
    2.3. 每一次访问到一个对象,就把这个对象标记成可达,当完成所有的对象,未被标记的就是垃圾。

释放垃圾:

  • 标记 - 清除:把垃圾对象的内存直接进行释放。
    • 缺点:会产生内存碎片问题(回收后导致内存空间不连续)
  • 复制算法:一片内存空间,一分为二,一次只使用其中一半。当垃圾回收的时候,先将不是垃圾的内存复制到另一半没使用的内存中,再将这一半整体释放掉。
    • 缺点:内存空间利用率低,一旦不是垃圾的对象很大,复制的成本就很高。
  • 标记 - 整理:类似于顺序表删除数据操作,将不是垃圾的内存向前移动,最后回收后面一片的内存。
    • 缺点:内存搬运数据的成本很高。
  • 分代回收:把上面的三种方式结合起来,主要是2和3。Java给的策略。
    • ”代” - 》指代对象经历的GC轮次(先将内存分为 新生代区 和 老年代区),初始为0,经一轮GC后就加1;如果一个对象的轮次已经很大了,那么大概率还会存在很久。对轮次大的对象,GC的频率就会降低。
    • 进一步会将新生代分为 伊甸区 和两个幸存区,比例大概8:1:1。
    • 新创建的对象放入伊甸区,大部分伊甸区的对象熬不过第一轮GC,熬过去了就通过 复制算法 进入一个幸存区;
    • 一个幸存区的对象又熬过一轮GC就会通过 复制算法 进入另一个幸存区,反复跳跃
    • 如果一个对象在幸存区经历了多轮GC,就会晋升到老年代区。
    • 老年代区就使用的标记 - 整理 回收机制。
    • 如果一个对象特别大,直接进入老年代区。

Read more

Stable Yogi Leather-Dress-Collection开源可部署:SD1.5+Anything V5本地化部署全流程

Stable Yogi Leather-Dress-Collection开源可部署:SD1.5+Anything V5本地化部署全流程 想亲手打造一个能生成各种动漫风格皮衣穿搭的AI工具吗?今天,我们就来一步步部署一个名为“Stable Yogi Leather-Dress-Collection”的开源项目。它基于经典的Stable Diffusion 1.5模型和流行的Anything V5动漫风格模型,专门用来生成2.5D风格的皮衣穿搭图片。 这个工具最大的特点是“省心”。你不用再手动切换各种皮衣风格的模型文件,也不用费心去想复杂的提示词。它内置了智能管理功能,能自动识别你准备好的皮衣款式,并帮你生成匹配的绘图指令。更重要的是,它经过深度优化,对电脑显卡的要求比较友好,并且完全在本地运行,不需要联网,保护你的隐私。 无论你是想体验AI绘画的乐趣,还是想为角色设计寻找灵感,这个工具都是一个不错的起点。接下来,我将带你从零开始,完成整个环境的搭建和工具的启动。 1. 环境准备与项目部署 在开始生成酷炫的皮衣穿搭图之前,我们需要先把“画室”搭建好。这个过程主要分为两步:准备好

By Ne0inhk
开源模型如何盈利

开源模型如何盈利

🍋🍋AI学习🍋🍋🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞 当下 AI 大厂选择开源模型,不是放弃产品竞争,而是换了一种更高级的竞争方式—— 从「闭源模型独占」转向「开源生态主导」,看似 “让利”,实则是构建更深的技术壁垒、商业护城河和行业话语权,完全符合大厂的长期战略利益。 下面从核心动机、竞争逻辑、商业化路径三个维度拆解,结合你熟悉的大模型技术栈(LoRA、DPO、vLLM)和应用场景(体检质控、养老机器人),讲清楚背后的底层逻辑: 一、 大厂开源模型的核心动机:不是慈善,是战略布局 1. 用开源构建「生态壁垒」,绑定开发者群体 大厂的核心竞争力从来不是 “模型参数大小”,而是围绕模型的工具链、算力资源、行业解决方案。开源基础模型,本质是

By Ne0inhk

ZEEKLOG博客推荐:2025年最值得尝试的开源ASR工具

2025年最值得尝试的开源ASR工具:Fun-ASR深度解析 在智能办公、远程协作和语音交互日益普及的今天,如何高效地将会议录音、客户通话或访谈内容转化为可编辑的文字,已成为企业和开发者面临的核心挑战之一。尽管市面上已有不少商业语音识别API,但高昂的成本、数据外传的风险以及对专业术语识别不准等问题,始终制约着其在敏感场景中的广泛应用。 正是在这样的背景下,由钉钉与通义实验室联合推出、开发者“科哥”主导构建的 Fun-ASR 横空出世。这款基于大模型的开源语音识别系统,不仅实现了接近实时的转写速度和高精度中文识别能力,更通过一个简洁直观的WebUI界面,让非技术人员也能轻松完成批量语音处理任务。它不是简单的技术堆砌,而是一次面向真实使用场景的工程重构——将高性能、易用性与隐私保护真正融合在一起。 从端到端架构看Fun-ASR的技术实现 Fun-ASR 的核心是名为 Fun-ASR-Nano-2512 的端到端语音识别模型,采用Transformer-based结构设计,能够直接将音频信号映射为文本输出,跳过了传统ASR中复杂的声学模型、语言模型分离训练流程。整个识别过程被拆解

By Ne0inhk

GitHub 2FA双重验证实战指南:从Edge插件到扫码一步到位

1. 为什么你的GitHub账户急需2FA?一个真实的故事 前几天,一个朋友半夜给我发消息,语气都快哭了。他辛辛苦苦维护了两年的开源项目,代码仓库突然被清空了,还被人用他的账号发了一堆垃圾信息。他第一反应是密码泄露了,但密码是他用密码管理器生成的、又长又复杂的唯一密码。问题出在哪?后来GitHub支持团队回复说,他的账户遭遇了“凭证填充”攻击。简单说,就是黑客用从其他网站泄露的账号密码,来批量“撞”GitHub的登录。只要密码不幸在其他地方重复使用了,哪怕再复杂,也形同虚设。 这件事让我后背发凉,也让我下定决心,必须把双重验证(2FA)这个“防盗门”给身边每一个开发者朋友都安上。你可能觉得,我的代码又不值钱,谁会来黑我?这个想法太危险了。你的GitHub账户远不止是一个代码托管平台。它关联着你的数字身份,是你技术能力的名片,可能链接着你的云服务密钥、CI/CD流水线,甚至是公司的私有仓库。一旦失守,损失的可能不只是代码,更是信誉和机会。 GitHub官方也一直在大力推动2FA。现在,很多敏感操作,比如修改密码、

By Ne0inhk