iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【JVM】JVM内存模型(详细)
  • 328
分享到

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

jvmjava面试 2023-08-16 18:08:02 328人浏览 薄情痞子
摘要

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

一.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部署太多应用。内存满了就oomjdk1.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

①配置某个项目

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

②全局配置

在这里插入图片描述

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

来源地址:https://blog.csdn.net/twotwo22222/article/details/127890270

--结束END--

本文标题: 【JVM】JVM内存模型(详细)

本文链接: https://www.lsjlt.com/news/371950.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JVM】JVM内存模型(详细)
    目录 一.JVM概述1.jvm简介2.jvm作用3.jvm的内存模型 二.类加载器1.类加载器的作用2.加载器的类型3.双亲委派机制的运行过程4.双亲委派机制优缺点5.为什么要破坏双亲委派机制6.破坏双亲委派机制的方式 三....
    99+
    2023-08-16
    jvm java 面试
  • 【JVM】JVM内存模型详解
    一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收...
    99+
    2023-09-16
    jvm java 面试
  • Java 内存模型(JVM)
    目录前言一、什么是 Java 内存模型二、为什么需要 Java 内存模型三、顺序一致性内存模型四、Happens-Before 规则前言 在并发编程中,当多个线程同时访问同一个共享...
    99+
    2022-11-12
  • 详解JVM系列之内存模型
    目录1. 内存模型和运行时数据区2、思维导图和图例3、对象向JVM申请空间4、为什么需要Survivor区?5、为什么需要两个Survivor区?6、例子进行验证堆内...
    99+
    2022-11-12
  • 什么是JVM内存模型?
    本篇文章带大家初步了解一下JVM内存模型,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。计算机内存模型在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大...
    99+
    2016-08-29
    java教程 java JVM
  • JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。...
    99+
    2023-08-30
    jvm GC 直接内存 jvm性能调优
  • java jvm内存模型有哪些
    Java虚拟机(JVM)内存模型主要有以下几个部分:1. 堆内存(Heap):用于存储Java对象的实例以及数组。堆内存是所有线程共...
    99+
    2023-10-12
    java jvm
  • JVM入门之JVM内存结构内容详解
    一、java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成...
    99+
    2022-11-12
  • 如何进行JVM内存模型使用
    这篇文章给大家介绍如何进行JVM内存模型使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。你对JVM内存模型是否熟悉,这里和大家分享一下,主要包括栈和堆两部分内容,Java栈是与每一个线程关联的,JVM在创建每一个线程...
    99+
    2023-06-17
  • JVM双亲委派模型知识详细总结
    目录一、简介二、双亲委派的意义三、JVM提供的类加载器四、执行类加载的五种方式五、自定义类加载器六、总结一、简介 除了顶层的启动类加载器(Bootstrap ClassLoader)...
    99+
    2022-11-12
  • JVM内存模型/内存空间:运行时数据区
    目录JVM内存模型/内存空间① 程序计数器 (Program Counter Register)② Java虚拟机栈 (VM Stack)&n...
    99+
    2022-11-12
  • jvm中java内存模型的示例分析
    这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存...
    99+
    2023-06-19
  • Java JVM内存区域详解
    目录程序计数器Java虚拟机栈方法/函数如何调用?堆总结原网页:JavaGuide JVM在执行Java程序过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8和之前的版本...
    99+
    2022-11-12
  • JVM 运行时数据区与JMM 内存模型
    目录1. JVM 运行时数据区2. JMM 内存模型硬件内存模型JMM3. 可见行与 volatile 关键字1. JVM 运行时数据区 JVM运行时数据区可以分为元空间,堆,虚拟机...
    99+
    2022-11-13
    JVM 运行时数据区 JMM 内存模型
  • 一篇文章带你了解JVM内存模型
    目录1. JVM介绍 1.1 什么是JVM?1.2 JVM的优点 1.2.1 一次编写,到处运行。1.2.2 自动内存管理,垃圾回收机制。1.2.3 数组下标越界...
    99+
    2022-11-12
  • java内存模型jvm虚拟机简要分析
    目录主内存和工作内存内存间的交互操作原子性、可见性、有序性原子性可见性有序性主内存和工作内存 Java 内存模型规定了所有的变量都存储在主内存中, 每条线程有自己的工作内存...
    99+
    2022-11-12
  • JVM系列之内存模型的示例分析
    这篇文章主要介绍JVM系列之内存模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 内存模型和运行时数据区这一章学习java虚拟机内存模型(Java Virtual machine menory mod...
    99+
    2023-06-15
  • java jvm内存模型的操作方法有哪些
    Java虚拟机(JVM)的内存模型操作方法主要有以下几种:1. 堆内存管理:Java堆是JVM管理的最大的一块内存区域,用于存储对象...
    99+
    2023-10-18
    java jvm
  • JVM内存参数配置详解
    首先我们知道:JVM发生内存错误的类型 1、堆内存泄漏:OutOfMemory:Java heap space 此种内存泄漏,增加内存,只能暂时解决问题,并不能根治问题。必须要优化代...
    99+
    2022-11-13
  • JAVA虚拟机(JVM)详细讲解(二)——内存的划分
    我们知道,在C++语言里,如果想使用一个对象,需要对其进行new操作;如果不用这个对象了,需要对其进行delete操作。一旦开发人员忘记写delete语句了,就会造成内存泄露。【内存被对象占用着不还,就叫内存泄露。】而java就聪明了,它从...
    99+
    2020-08-19
    java教程 JVM
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作