墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 正文

【JVM】JVM内存模型(详细)

2023年 5月 18日 138点热度 0人点赞 0条评论

一、JVM概述

  1. JVM简介

JVM(Java Virtual Machine)即Java虚拟机,是一种能够运行Java字节码的虚拟机。它是Java语言的核心,提供了Java程序运行的环境。

  1. JVM作用

JVM的主要作用是将Java程序编译成字节码,然后在虚拟机中运行。它提供了内存管理、垃圾回收、安全管理、动态链接、线程管理等机制,保证了Java程序的可移植性、安全性和稳定性。

  1. JVM的内存模型

JVM的内存模型分为以下几个部分:方法区、堆、栈、本地方法栈和程序计数器。

二、类加载器

  1. 类加载器的作用

类加载器负责将Java字节码加载到JVM中,并将其转换为Java类。它是Java语言的重要特性之一,也是实现Java语言动态性和可扩展性的关键。

  1. 加载器的类型

Java类加载器主要分为以下几种类型:启动类加载器、扩展类加载器、应用程序类加载器和自定义加载器。

  1. 双亲委派机制的运行过程

双亲委派机制是指类加载器在加载类时,先将请求委托给父加载器处理。如果父加载器无法加载该类,则将请求委托给其子加载器处理,直到找到能够加载该类的加载器为止。该机制保证了类的唯一性和安全性。

  1. 双亲委派机制优缺点

双亲委派机制的优点是可以保证类的唯一性和安全性,缺点是会导致类的加载效率低下。

  1. 为什么要破坏双亲委派机制

有时候,我们需要在运行时动态加载类或者在不同的环境中加载同一个类,这时候就需要破坏双亲委派机制。

  1. 破坏双亲委派机制的方式

破坏双亲委派机制的方式主要有以下两种:线程上下文类加载器和SPI机制。

三、JVM内存模块

  1. 方法区(线程共享)

方法区是线程共享的内存区域,存放着类的信息、常量、静态变量等数据。

  1. 堆(线程共享)

堆是线程共享的内存区域,存放着对象及其实例变量等数据。

GC主要在新生区(伊甸园区)、老年区
    新生区(伊甸园区(对象都是在这个区new出来的)、幸存区to、幸存区from:幸存区位置会互相交换,谁空谁是to)
    老年区
    永久区:存储的是java的运行环境或类信息,这个区域不存在垃圾回收,关闭jvm就会释放内存
            一个启动类加载大量的jar包。tomcat部署太多应用。内存满了就oom
            jdk1.6之前:永久代,常量池是在方法区
            jdk1.7去永久代,常量池在堆中
            jdk1.8之后:无永久代,常量池在元空间中
  1. 栈(虚拟机栈-线程隔离)

栈是虚拟机栈,是线程隔离的内存区域,存放着方法的局部变量、操作数栈、返回值等数据。

  1. 栈(本地方法栈-线程隔离)

本地方法栈也是线程隔离的内存区域,存放着本地方法的参数和返回值等数据。

  1. 程序计数器(线程隔离)

程序计数器是线程隔离的内存区域,用于记录当前线程执行的字节码指令地址。

  1. OutOfMemoryError内存溢出和StackOverFlowError栈溢出及解决方法

(1) OutOfMemoryError内存溢出(OOM)

OutOfMemoryError是指JVM中没有足够的空间来为对象分配内存时抛出的异常。解决方法包括增加JVM内存、优化程序代码、使用对象池等。

(2) StackOverFlowError栈溢出

StackOverFlowError是指当线程请求的栈深度大于JVM所允许的深度时抛出的异常。解决方法包括增加JVM栈深度、优化程序代码等。

(3) IDEA配置JVM

在IDEA中配置JVM可以通过在VM options中添加参数来实现,例如:

-Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC

其中,-Xmx表示JVM最大可用内存,-Xms表示JVM初始分配的内存,-XX:+UseConcMarkSweepGC表示使用CMS垃圾回收器。

代码示例:

public class ClassLoaderTest {
    public static void main(String[] args) {
        System.out.println("ClassLoaderTest's ClassLoader is " + ClassLoaderTest.class.getClassLoader());
        System.out.println("The Parent of ClassLoaderTest's ClassLoader is " + ClassLoaderTest.class.getClassLoader().getParent());
        System.out.println("The GrandParent of ClassLoaderTest's ClassLoader is " + ClassLoaderTest.class.getClassLoader().getParent().getParent());
    }
}

输出结果:

ClassLoaderTest's ClassLoader is sun.misc.Launcher$AppClassLoader@18b4aac2
The Parent of ClassLoaderTest's ClassLoader is sun.misc.Launcher$ExtClassLoader@1a54a6e7
The GrandParent of ClassLoaderTest's ClassLoader is null
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java JDK JVM 内存模型 类加载器
最后更新:2023年 5月 16日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
Spring DI:依赖注入的完整指南 java 数据库连接池技术 HikariCP的(超详细总结) 设计模式:适配器模式 来了!昨天发布的数学「新王炸」:DeepSeek-Prover-V2-671B,6710亿参数狂揽证明SOTA,模型与数据集全开源! 谷歌下场,寸草不生?Firebase Studio 挥舞 AI 大棒,誓要统一开发者江湖! 美团外卖搭上 DeepSeek 这趟 AI 快车,外卖界要变天啦!
标签聚合
动态规划 java 算法 教程 deepseek spring 设计模式 AI

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策