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

目录

1.什么是JVM

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

3.JVM的内部结构

4.各部分的作用  

        4.1 类加载器

        4.2 方法区

        4.3 堆

​编辑         4.4 虚拟机栈

        4.5 程序计数器

        4.6 本地方法栈

        4.7 解释器和JIT即时编译器

        4.9 GC垃圾回收

5.拓展

        5.1一些可能会遇到的问题

        5.2堆内存溢出诊断方法

        5.3linux环境下线程诊断方法 


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 类加载器

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

        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)

         4.4 虚拟机栈

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

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

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

        4.5 程序计数器

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

        4.6 本地方法栈

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

        4.7 解释器和JIT即时编译器

        4.9 GC垃圾回收

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

         详细内容见另一篇博客:JVM学习-垃圾回收专题。

5.拓展

        5.1一些可能会遇到的问题

        5.2堆内存溢出诊断方法

        5.3linux环境下线程诊断方法 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…

dp入门:从暴力dfs 到 dp

本篇为小金鱼大佬视频的学习笔记&#xff0c;原视频链接&#xff1a;https://www.bilibili.com/video/BV1r84y1379W?vd_source726e10ea5b787a300ceada715f64b4bf 基础概念 暴力dfs很多时候仅能过部分测试点&#xff0c;要想将其优化&#xff0c;一般以 dfs -> 记忆化搜索 …

汽车IVI中控开发入门及进阶(十三):语音识别

前言: IVI中控上的语音识别,在目前市场上也是非常显眼的一个创新,大幅改变了传统IVI的操作习惯。 语音识别Speech recognition,也称为自动语音识别(ASR)、计算机语音识别或语音到文本,是一种使程序能够将人类语音处理成书面格式的能力。 语音识别Speech recognition是计…

1.6w字数据库基础知识超详细解析~‍(进阶/复习版)

文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT&#xff1a;默认值约束5 PRIMARY KEY&#xff1a;主键约束6 FOREIGN KEY&#xff1a;外键约束…

Calendar类 --java学习笔记

Calendar 代表的是系统此刻时间对应的日历通过它可以单独获取、修改时间中的年、月、日、时、分、秒等 常见方法&#xff1a; 创建Calendar对象&#xff1a; 用Calendar.getInStance&#xff08;&#xff09;方法&#xff0c;返回一个此时此刻的日历&#xff08;Calendar&am…

关于IP地址证书的申请

对于直接通过IP地址访问的服务器&#xff0c;为其配置SSL证书同样至关重要。以下是一份详尽的指南&#xff0c;教你如何为你的IP地址申请SSL证书。 IP地址证书目前有DV验证和OV验证两种主流的验证方式&#xff0c;DV验证只需验证IP的所有权&#xff0c;OV的在此基础上&#xff…

换根dp,LeetCode310. 最小高度树

一、题目 1、题目描述 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;一个任何没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#…

自媒体人的超级宝典

这个10块钱的小报童还有谁没买&#xff1f; 你可别等到它涨到19.9的时候来问我有没有优惠 昨天正式发售就已经2300人了&#xff0c;之前可是几个小时就涨了400多人&#xff0c;照这个速度下去&#xff0c;明天就要涨价了。 说实话&#xff0c;我看了里面的内容&#xff0c;觉…

Linux网络编程: 以太网帧Frame/ARP/RARP详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

SAP Activate项目管理方法论路线图

SAP Activate 是 SAP 推出的一种基于敏捷方法论的灵活、快速且引导式的实施方法论&#xff0c;专为加速SAP S/4HANA和其他SAP解决方案的部署而设计。这个方法论结合了最佳实践、引导配置和方法论本身的强大能力&#xff0c;以确保项目的快速实施和成功部署。SAP Activate的核心…

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…

22-分支和循环语句_while语句(下)(初阶)

该代码输出什么&#xff1f; int main() {char ch \0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9){continue;}putchar(ch);}return 0; } 结果&#xff1a;该代码只打印数字字符 附&#xff1a;ASCII码表

Python基础入门 --- 5.函数

文章目录 Python基础入门5.函数5.1 基本定义5.2 传入参数5.3 返回值5.3.1 None类型 5.4 说明文档5.5 嵌套调用 Python基础入门 5.函数 定义&#xff1a;可重复使用&#xff0c;用来实现特定功能的代码段。 # 不使用内置函数len&#xff0c;统计字符串的长度 str "Hell…

南卡罗来纳州历史和文化经济地理和自然政治和社会教育1. 加州大学公布2024年秋季入学新生和转学申请数据2. 2024考研国家线公布路德会信徒核心信仰礼拜和

目录 南卡罗来纳州 历史和文化 经济 地理和自然 政治和社会 教育 1. 加州大学公布2024年秋季入学新生和转学申请数据 2. 2024考研国家线公布 路德会信徒 核心信仰 礼拜和实践 分布 社会和文化影响 约翰塞巴斯蒂安巴赫 生平简介 音乐风格和作品 遗产和影响 …

AXI Lite协议详解

AXI Lite协议详解 axi&#xff08;Advanced eXtensible Interface&#xff09;是一种总线协议&#xff0c;该协议是ARM公司提出的amba&#xff08;Advanced Microcontroller Bus Architecture&#xff09;3.0协议中最重要的部分&#xff0c;是一种面向高性能、高带宽、低延迟的…

C++17之std::variant

1. std::variant操作 如下列出了为std:: variable <>提供的所有操作。

Docker 学习笔记一

一、什么是docker Docker 是一个基于轻量级虚拟化技术的容器&#xff0c;整个项目基于Go语言开发&#xff1b;Docker是一个C/S架构&#xff0c;后端众多模块各司其职&#xff0c;docker的daemon是运行在主机上通过client可以进行通信。 docker 由三部分组成&#xff1a;镜像(…

Rust 构建开源 Pingora 框架可以与nginx媲美

一、概述 Cloudflare 为何弃用 Nginx&#xff0c;选择使用 Rust 重新构建新的代理 Pingora 框架。Cloudflare 成立于2010年&#xff0c;是一家领先的云服务提供商&#xff0c;专注于内容分发网络&#xff08;CDN&#xff09;和分布式域名解析。它提供一系列安全和性能优化服务…

Figure 01掀起了具身智能的崭新篇章

在人工智能的发展历程中&#xff0c;OpenAI始终扮演着创新的先锋角色。最近&#xff0c;他们与Figure公司的合作成果尤为引人注目&#xff0c;这一合作将多模态大模型技术成功应用于Figure 01机器人的开发中&#xff0c;为人类与机器的互动开辟了全新的时代。该机器人不仅能够与…