JVM学习-JVM简介以及其内部结构

news2024/11/15 17:25:58

目录

1.什么是JVM

2.JVM、JRE、JDK、JavaSE、JavaEE之间的联系 

3.JVM的内部结构

4.各部分的作用  

        4.1 类加载器(附类加载过程导航)

        4.2 方法区

        4.3 堆(附常量池、运行时常量池、串池的介绍导航)

​        4.4 虚拟机栈(附底层字节码执行过程以及JVM的自动优化导航)

        4.5 程序计数器

        4.6 本地方法栈

        4.7 解释器和JIT即时编译器

        4.9 GC垃圾回收(附详细内容以及JVM调优导航)

5.拓展

        5.1一些可能会遇到的问题

        5.2堆内存溢出诊断方法

        5.3 linux环境下线程诊断方法 

        5.4 JMM介绍(附详细内容导航)


1.什么是JVM

        JVM是Java虚拟机的缩写,是Java程序的运行环境。更准确地说是Java程序的二进制字节码的运行环境,因为JVM的主要作用是将Java源码编译为字节码并执行。Java程序之所以能够跨平台运行就是因为JVM的存在,JVM编译后的字节码在任何支持JVM的平台都可以运行且无需再次编译;并且JVM有自己的垃圾回收机制,自动管理内存,减轻了程序员内存管理的负担。

        通过学习JVM,我们就可以了解一个Java程序在底层的执行过程,进而优化我们的代码。

2.JVM、JRE、JDK、JavaSE、JavaEE之间的联系 

3.JVM的内部结构

        

4.各部分的作用  

        4.1 类加载器(附类加载过程导航)

        用来加载类的二进制字节码(包括类的基本信息、常量池,类方法定义)。有四种类加载器:启动类加载器、扩展类加载器、应用类加载器、自定义类加载器

        类加载的过程见另一篇博客JVM学习-类加载-CSDN博客。

        4.2 方法区

        方法区是线程共享的一块区域,存储了和类结构相关的信息,比如运行时常量池、成员变量、方法数据等;方法区在虚拟机启动时被创建,逻辑上是堆的一部分。之所以说逻辑上是堆的一部分是因为实际的存储位置并不一定在堆中,比如Hotspot(JVM的一种)的jdk1.8版本是将方法区放在了元空间,而元空间使用的是操作系统的一部分内存;jdk1.6版本的则放在了永久代中,永久代使用的是堆内存。方法区也会触发垃圾回收当大量的类被加载时会导致方法区空间不足。要注意的是,在JDK1.7版本前方法区空间不足触发的异常是内存不足:永久代(java.lang.OutOfMemoryError: PermGen space),在JDK1.8版本后则是内存不足:元空间(java.lang.OutOfMemoryError: Metaspace)

        4.3 堆(附常量池、运行时常量池、串池的介绍导航)

        堆是线程共享的,所有通过new创建的对象都会存放在堆中。当存储的对象过多或者串池存放的值过多时会导致堆内存溢出,也就会触发垃圾回收如果垃圾回收后堆内存仍不足,那就是其中的对象大部分都还在被使用无法回收,内存占用仍然很高。要注意的是,在JDK1.6版本前串池空间不足触发的异常是内存不足:永久代(java.lang.OutOfMemoryError: PermGen space),而JDK1.7版本后提示的异常则是内存不足:堆空间(java.lang.OutOfMemoryError: Java heap space)

        常量池、运行时常量池、串池的介绍见另一篇博客:

        JVM学习-常量池、运行时常量池以及串池-CSDN博客

         4.4 虚拟机栈(附底层字节码执行过程以及JVM的自动优化导航)

        每个线程在创建时都会创建一个虚拟机栈,这是线程运行所需要的内存,所以虚拟机栈是线程私有的。每个栈中存放一个个栈帧,栈帧则是调用一个方法所需要的内存,里面存放着局部变量表、操作数栈、返回地址等;栈帧中仅有一个活动栈帧,对应当前正在执行的方法,也是栈顶的栈帧,如果当前方法调用了其他方法,那么对应的新的栈帧会被创建出来,放在栈的顶端成为新的活动栈帧。当方法执行完成或者抛出异常自动结束执行时,均作为执行完毕处理,就会将该方法对应的栈帧弹出虚拟机栈,活动栈帧自然就会变成下一个方法对应的栈帧。

        虚拟机栈不会触发垃圾回收,因为方法执行完后栈帧就被弹出去了,不会留在栈中。但存在栈内存溢出的问题,一种是栈帧过多导致的,比如无限递归;另一种是栈帧过大导致的,一般都是由栈帧过多引起的栈内存溢出,因为普通情况下执行一个方法所用到的局部变量不是很多,栈帧也不会太大。

        虚拟机栈由于栈帧中的局部变量都是线程私有的,所以只要不逃离线程的作用范围就不会产生线程安全问题;但堆是线程共享的,所以都需要考虑线程安全问题。

        底层字节码执行过程见另一篇博客JVM学习-底层字节码的执行过程-CSDN博客

        JVM的自动优化见另一篇博客JVM学习-JVM的自动优化-CSDN博客。

        4.5 程序计数器

        主要作用就是记住下一条JVM指令的执行地址,以在执行完当前的一个JVM指令后能够找到下一个指令,实际上是一个寄存器,每个线程只有一个程序计数器,且程序计数器是线程私有的不存在内存溢出的问题

        4.6 本地方法栈

        本地方法栈是线程私有的,随着线程的结束而消失,所以不会触发垃圾回收。 

        4.7 解释器和JIT即时编译器

        4.9 GC垃圾回收(附详细内容以及JVM调优导航)

        当堆内存不足时就会出发垃圾回收,堆中存放对象的地方又分为新生代和老年代, 新生代又分为伊甸园和幸存区,幸存区分为from和to两部分。一般情况下,新产生的对象被放在伊甸园中,执行垃圾回收时没有被回收的对象会放到幸存区中,如果这些对象在执行多次垃圾回收时依旧没有被回收,那么就会将这些对象从幸存区放到老年代中。

         详细内容及JVM调优见另一篇博客:JVM学习-垃圾回收专题+GC调优-CSDN博客。

5.拓展

        5.1一些可能会遇到的问题

        5.2堆内存溢出诊断方法

        5.3 linux环境下线程诊断方法 

        5.4 JMM介绍(附详细内容导航)

         JMM即Java内存模型 ,定义了一套在多线程读写共享数据(如数组、成员变量等)时,对数据的可见性、有序性、原子性的规则和保障。JMM和Java内存结构关系不大,内存结构就是JVM的内存组成、垃圾回收以及字节码和类加载的一些技术。

        详细内容见另一篇博客JVM学习-JMM-CSDN博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android14 - Framework- Configuration的创建和更新

本文描述从启动一个新进程的Activity起,Framwork层Configuration的创建和传导过程。 首先,我们知道所有的Window容器都继承于WindowContainer,而WindowContainer本身是ConfigurationContainer的子类。于此同时,WindowProcessContr…

高级数据结构 <AVL树>

本文已收录至《数据结构(C/C语言)》专栏! 作者:ARMCSKGT 目录 前言正文AVL树的性质AVL树的定义AVL树的插入函数左单旋右单旋右左双旋左右双旋 检验AVL树的合法性关于AVL树 最后 前言 前面我们学习了二叉树,普通的二叉树没有任何特殊性质&…

数据结构面试常见问题之Insert or Merge

😀前言 本文将讨论如何区分插入排序和归并排序两种排序算法。我们将通过判断序列的有序性来确定使用哪种算法进行排序。具体而言,我们将介绍判断插入排序和归并排序的方法,并讨论最小和最大的能区分两种算法的序列长度。 🏠个人主…

pycorrector检测OCR错字实践

参考:https://github.com/shibing624/pycorrector/tree/master/examples/macbert stopwords.txt 添加专业停用词,避免错误 设置自定义词典,避免将正确的词错误检测成错误的词 from pycorrector import Corrector m Corrector() m.set_cus…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.4 会计凭证处理

2.4.1 会计凭证处理的基本概念 会计凭证是企业经济业务在会计上的反映,它是用会计语言表达的一种单据。 典型生产企业的财务凭证创建方式: 企业在实施SAP的过程中,大部分凭证都是自动生成的。要保证这些凭证能准确地生成,必须要满…

mysql 数据库 基本介绍

一 数据 (一)数据是什么 描述事物的符号记录 包括数字,文字、图形、图像、声音、档案记录气 以“记录”形式按统一的格式进行存储 (二)数据的分类 1,结构化的数据 即有固定格式和有限长度的数据。例…

hcip复习总结1

OSI----------- 定义了数据的产生标准 。 7 层 应用 ------- 表示 会话 传输 -----Telnet - 23 ssh---22 http---80 https-443 TCP ---- 传输控制卋议。是一种面向连接的可靠的传输卋议。 UDP---- 用户数据报卋议。是一种非面向连接的丌可靠传输卋议。 保证可靠性&…

面向量产!基于视觉的速度距离估计

面向量产!基于视觉的速度距离估计 论文名称:Vision-based Vehicle Speed Estimation: A Survey 导读 在精确检测车速车距的方案中,视觉方案是非常具有挑战性的,但由于没有昂贵的距离传感器而大幅降低成本,所以潜力巨…

国内智能驾驶芯片领先供应商地平线智能驾驶芯片介绍

地平线国内智能驾驶芯片领先供应商,由国际著名机器学习专家余凯博士于2015年7月创建;2017年12月,地平线即推出了首款 智能芯片征程1和旭日1;2019年8月,宣布量产中国首款车规级智能芯片征程2并于同年10月发 布新一代AIo…

【Git】第二课:git安装和配置

安装 我们伟大祖国有句古话叫巧妇难为无米之炊,还有句话叫工欲善其事必先利其器。所以,在正式的学习之前,我们需要先把git这把利器安装好。 Windows系统 下载安装包 打开Git - Downloading Package页面,根据系统类型32位还是6…

有ai写文案的工具吗?分享5款好用的工具!

在数字化时代,人工智能(AI)已渗透到我们生活的方方面面,包括内容创作领域。AI写文案的软件以其高效、便捷的特点,正逐渐受到广大内容创作者、营销人员、甚至普通用户的青睐。本文将为您盘点几款热门的AI写文案软件&…

Zotero引入英文参考文献作者都是大写字母问题

修改之前是这样的: 修改过程 进入word 打开样式编辑器 打开后,找到这里: 删除 text-case“uppercase” 就可以实现这个样式: 然后我们点击保存,将这个样式文件另存为,然后替换掉原来的文件 源文件在 …

聚焦两会:数字化再加速,VR全景助力制造业转型

近年来,随着信息技术、人工智能、VR虚拟现实等新兴技术的不断涌现,数字化正日益成为推动当今经济发展的新驱动力。在不久前的两会上,数字化经济和创新技术再度成为热门话题: 国务院总理李强作政府工作报告: 要深入推…

误删了Linux系统的libm.so.6文件与libm-2.27.so的软链接导致的开机出现kernel panic的解决方案(图文U盘救援详细教程)

事情起因 最近在做嵌入式视觉,捣弄rknn3588,在推理过程中报了一个错,就是说我的GLIBC的版本太低了,我也没有多想,想着升一下版本就好了,然后找到了这篇博客。【请谨慎操作】Ubuntu18.04升级GLIBC_2.29&…

云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

作者:周静、吴宇奇、泮圣伟 在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通…

Java学习笔记NO.25

T2.编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。要求: (1)定义乐器类Instrument,包括方法makeSound() (2)定义乐器类的子类:二胡Erhu、钢琴Piano和小提琴Violin (3)定义乐手类…

2024年【T电梯修理】模拟考试及T电梯修理模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理模拟考试是安全生产模拟考试一点通生成的,T电梯修理证模拟考试题库是根据T电梯修理最新版教材汇编出T电梯修理仿真模拟考试。2024年【T电梯修理】模拟考试及T电梯修理模拟考试题库 1、【多选题】…

PPT好看配色

放几个链接!画图时候可以参考!转自知乎 Color Hunt ColorDrop 中国色 Flat UI Colors Coolors

HBase Shell基本操作

一、进入Hbase Shell客户端 先在Linux Shell命令行终端执行start-dfs.sh脚本启动HDFS,再执行start-hbase.sh脚本启动HBase。如果Linux系统已配置HBase环境变量,可直接在任意目录下执行hbase shell脚本命令,就可进入HBase Shell的命令行终端环…

关于UDP协议

UDP协议是基于非连接的发送数据就是把数据包简单封装一下,然后从网卡发出去就可以,数据包之间没有状态上的联系,UDP处理方式简单,所以性能损耗非常少,对于CPU、内存资源的占用远小于TCP,但是对于网络传输过…