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

2023-11-02

一.JVM概述

1.jvm简介

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

2.jvm作用

Java中的所有类,必须被装载到JVM中才能运行,这个装载工作是由jvm中的类装载器完成的,.class这个类型可以在虚拟机运行,但不是直接和操作系统交互,需要jvm解释给操作系统,解释的时候需要java类库,这样就能和操作系统交互。

3.jvm的内存模型

在这里插入图片描述




二.类加载器

1.类加载器的作用

将class字节码内容加载到内存中,并将这些静态数据转换成方法区运行时数据结构,然后在堆中形成代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。类装载器所做的工作实质是把类文件从硬盘读取到内存中。

2.加载器的类型

引导类加载器(Bootstrap ClassLoader):用c++编写,是JVM自带的类加载器,负责java平台核心库,用来装载核心类库,该加载器无法直接获取。
拓展类加载器(Extension ClassLoader):负责jre/lib/ext目录下的jar包或 -D java.ext.dirs 指定下的jar包装入工作库。
系统类加载器(Application ClassLoader):负责java-classpath或者 -D java.class.path所指的目录下的类与jar包装入工作,是最常用的加载器。
自定义类加载器(Custom ClassLoader):由开发人员自己定义。

在这里插入图片描述
在这里插入图片描述

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

① 类加载器收到类加载的请求。

② 将这个请求委托给父类加载器去完成,一直向上委托,直到引导类加载器。

③ 引导类加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载,向下加载。

④ 重复步骤③。

4.双亲委派机制优缺点

优点: 保证类加载的安全性,不管那个类被加载,都会被委托给引导类加载器,只有类加载器不能加载,才会让子加载器加载,这样保证最后得到的对象都是同样的一个。
缺点: 子加载器可以使用父加载器加载的类,而父加载器不能使用子加载器加载的类。

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

原因: 子加载器可以使用父加载器加载的类,而父加载器不能使用子加载器加载的类。
举例: 使用JDBC连接数据库,需要用到 com.mysql.jdbc.Driver和DriverManager类。然而DriverManager被引导类加载器所加载,而com.mysql.jdbc.Driver被当前调用者的加载器加载,使用引导类加载器加载不到,所以要打破双亲委派机制。

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

(1) 自定义类加载器,重写loadclss()方法。
(2) 使用线程上下文类(ServiceLoader:使父加载器可以加载子加载器的类)。

三.JVM内存模块

1.方法区(线程共享)

方法区存储的是:常量池、静态变量(static)以及方法信息(修饰符、方法名、返回值、参数等)、类信息(类变量)等

2.堆(线程共享)

概念:堆是线程共享的内存区域,它是虚拟机管理内存中最大的一块。

堆储存的是:实例对象。
比如 A a1 = new A();a1就是实例对象。A a2;a2就是类对象。

堆的具体示意图(jdk8及之后)

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

在这里插入图片描述

3.栈(虚拟机栈-线程隔离)

概念:又名堆栈,主管程序运行,生命周期和线程同步,线程结束,栈内存就释放了。不存在垃圾回收问题。

虚拟机栈储存的是:8大基本类型 + 对象引用 + 实例方法

栈的具体示意图
在这里插入图片描述

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

本地方法栈储存的是:本地接口库里调用的方法,就是java里面native关键字修饰的方法。
凡是带native关键字的,说明java的作用范围达不到了,回去调用底层c/c++语言的库,首先会进入本地方法栈,然后到本地方法接口。

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

每个线程启动是都会创建一个程序计数器,保存的是正在执行的jvm指令,程序计数器总是指向下一条将被执行指令的地址。生命周期与线程的生命周期保持一致。

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

不论是内存溢出还是栈溢出,简单来说就是你放的太多了空间不够了,溢出来了,这样就比较好理解了。

(1) OutOfMemoryError内存溢出(OOM)

原因:①是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。
   ②由于长期保持某些资源的引用,垃圾回收器无法回收它,从而使该资源不能够及时释放,也称为内存泄露。

解决:①设置JVM的堆参数( -Xmx:JVM最大内存 -Xms:启动初始内存 -Xmn:新生代大小 -Xss:每个线程虚拟机栈及堆栈的大小 ) 例如:-Xms1024m -Xmx1024m -Xmn512m -Xss5m
   ②分析内存,看一下那个地方出现了问题(专业工具:Jprofiler,MAT)分析Dump内存文件, 快速定位内存泄漏,怎么查找dump文件,直接找到文件的文件夹打开获得大的对象。

制造堆溢出:一直死循环new对象就ok了。

  • –Xms:JVM初始分配的堆内存,默认是物理内存的1/64。
  • –Xmx:JVM最大允许分配的堆内存,默认是物理内存的1/4。
  • –Xmn:堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn。
  • –Xss:规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。
  • 更多JVM调优总结及命令

(2) StackOverFlowError栈溢出

原因:线程请求分配的栈容量超过Java虚拟机栈允许的最大容量。

解决:①修改代码 ②增加线程堆栈大小(-Xss)。

制造栈溢出:一直死循环调用方法就行。

(3) idea配置jvm

①配置某个项目

在这里插入图片描述
在这里插入图片描述

②全局配置

在这里插入图片描述

另一篇:垃圾回收机制详细讲解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JVM】JVM内存模型(详细) 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will

随机推荐

  • C/C++ 运算符优先级

    原文链接 https blog csdn net skywalker leo article details 6237222 抄写一遍 帮助记忆 注 数字越小优先级越高 关于运算符优先级的两点说明 1 同等级的运算符 运算次序由结合方向来决
  • MCP

    文献名 Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex proximity extension as
  • 华为OD机试 - 高矮个子排队(Java)

    题目描述 现在有一队小朋友 他们高矮不同 我们以正整数数组表示这一队小朋友的身高 如数组 5 3 1 2 3 我们现在希望小朋友排队 以 高 矮 高 矮 顺序排列 每一个 高 位置的小朋友要比相邻的位置高或者相等 每一个 矮 位置的小朋友要
  • BUCK电路

    一 Buck电路原理图 Buck电路 又称降压电路 其基本特征是DC DC转换电路 输出电压低于输入电压 输入电流为脉动的 输出电流为连续的 二 Buck电路工作原理 当开关管Q1驱动为高电平时 开关管导通 储能电感L1被充磁 流经电感的电
  • oracle默认用户名、密码

    一般来说 安装ORACLE时 若没有为下列用户重设密码 则其默认密码如下 用户名 密码 登录身份 说明 sys change on install SYSDBA 或 SYSOPER 不能以 NORMAL 登录 可作为默认的系统管理员 sys
  • pytorch迁移学习载入部分权重

    载入权重是迁移学习的重要部分 这个权重的来源可以是官方发布的预训练权重 也可以是你自己训练的权重并载入模型进行继续学习 使用官方预训练权重 这样的权重包含的信息量大且全面 可以适配一些小数据的任务 即小数据在使用迁移学习后仍然能够保持良好的
  • IE被www.537.com,www.COXDX.INFO劫持,修复~

    一位同事的电脑中IE一直使用265网址导航作首页 这天忽然变成hxxp www COXDX INFO z012了 修改不回来 请我帮忙检修 打开Internet选项 手动修改首页为http www 265 com 但总不能生效 将该电脑中的
  • Qt5学习笔记:Qt两个窗口(Widget)间传递数据

    0x01 原理介绍 Qt两个窗口之间传递数据实际上还是利用了信号与槽的概念来实现 本质上讲 我们只需要实现A窗口发射信号 B窗口槽函数响应信号即可 首先我们在A窗口的头文件中定义发射的信号 signals void sendSignal Q
  • 如何进行网站性能优化?

    分享人 chenxingxing 目录 1 背景介绍 2 知识剖析 3 常见问题 4 解决方案 5 编码实战 6 扩展思考 7 参考文献 8 更多讨论 一 背景介绍 前端优化的目的 1 用户 体验好 2 服务商 节省资源 简而言之 就是在不
  • mq的概念

    1 延迟队列 概念 延迟队列存储的是对应的延迟消息 所谓 延迟消息 是指当消息被发送以后 并不想让消费者立刻拿到消息 而是等待特定时间后 消费者才能拿到这个消息进行消费 应用场景 当你在网上购物的时候是否会遇到这样的提示 十分钟之内未付款
  • SDC时序约束 - create_clock

    在写 sdc约束文件时 要做的第一件事情就是使用create clock对进入FPGA的时钟进行约束 其语法格式如下 create clock add name
  • Ranger配置HDFS报错:curl: (3) [globbing] nested braces not supported at pos 2

    Ambari上显示错误信息 2017 11 06 13 01 00 618 Will retry 65 time s caught exception u Execution of curl location trusted k negot
  • 【Matlab】提取excel中的数据画折线图

    1 前言 在日常数据分析时 将数据保存为xlsx的格式进行存储 本文利用xlsread函数对excel数据进行提取 并利用其数据进行二维图像的绘制 2 excel中数据内容 3 代码 1代表sheet1 pwd xlsread C User
  • 第二周-目录命名规则及用途,文件的元数据,软连接和硬连接

    1 描述Linux发行版的系统目录名称命名规则以及用途 命名规则 文件和目录被组织成一个单根倒置树结构 文件系统从根目录下开始 用 表示 文件名称区分大小写 文件系统分层结构 LSB Linux Standard Base 标准Linux文
  • 初识vue3

    对vue3的理解 2020年9月发布的正式版 vue3支持大多数的Vue2的特性 Vue中设计了一套强大的组合APi代替了Vue2中的option API 复用性更强了 更好的支持TS 最主要 Vue3中使用了Proxy配合Reflect代
  • notepad++中配置python IDE

    操作系统是windows7 notepad 版本是5 9 6 2的安装版 python版本是2 7 2 windows7下的python安装配置在http blog csdn net gabriel1026 article details
  • 《算法和数据结构》数学基础总结

    前言 算法是什么 数学是什么 算法中的数学又是什么 这篇文章 让我来为大家介绍下法中的数学基础 数学可以说是算法的基石 所谓万丈高楼平地起 如若根基不稳 那么再高的楼 也只是豆腐渣工程 随时都有塌陷的可能 所以数学之于算法 可谓 非常重要
  • vmware 虚拟机开机自启动脚本

    1 建立一个txt文件 D VMware VMware Workstation vmrun exe T ws start I Documents Virtual Machines centos centos vmx nogui 注意 如果路
  • Python学习之爬取网页图片(单张)

    import requests import os os 库是Python标准库 包含几百个函数 常用的有路径操作 进程管理 环境参数等 root D pictures url input 请输入图片链接 让用户输入图片链接 path ro
  • 【JVM】JVM内存模型(详细)

    目录 一 JVM概述 1 jvm简介 2 jvm作用 3 jvm的内存模型 二 类加载器 1 类加载器的作用 2 加载器的类型 3 双亲委派机制的运行过程 4 双亲委派机制优缺点 5 为什么要破坏双亲委派机制 6 破坏双亲委派机制的方式 三