【java虚拟机】JVM知识框架快速一览

2024-06-11 04:44

本文主要是介绍【java虚拟机】JVM知识框架快速一览,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一. JVM相关概念
  • 二. 运行时数据区
  • 三. GC垃圾回收
  • 四. 字节码与JVM类加载
  • 五. 调试与诊断
  • 六. 性能调优

一. JVM相关概念

JVM基础(1):java字节码文件-class文件到底是什么

JVM基础(4)- JMM:java内存模型与线程安全

JVM 基础(3) - (面试高频)JVM 内存结构:栈、堆、逃逸分析、元空间还是永久代

 

二. 运行时数据区

  • 运行时数据区及线程概述
  • 介绍运行时数据区的内部结构,运行时数据区包括方法区、程序计数器、本地方法栈、堆区以及虚拟机栈。
  • 从线程的角度可以把运行时数据区分为线程私有和线程共享两部分
  • 程序计数器
  • 程序计数器可以看作是当前线程所执行的字节码的行号指示器,指示着下一条将要执行的字节码指令。
  • 程序计数器是线程私有的,各线程之间程序计数器互不干扰。
  • 虚拟机栈
  • Java语言为什么基于栈结构进行设计,以及栈帧与线程之间的关系。
  • 栈是由一个个的栈帧组成,每个栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息。
  • 其中局部变量表主要用于存储方法参数和定义在方法体内的局部变量,slot是局部变量表中最基本的存储单元。
  • 操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
  • 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。
  • 方法返回地址中存储的是调用该方法的程序计数器的值,当字节码指令执行到ireturn、lreturn、freturn、dreturn、areturn、return时该方法执行结束。
  • 最后详细介绍了方法调用的分类、虚方法、非虚方法、虚方法表等内容。
  • 本地方法接口
  • Java为我们提供的简洁的本地方法接口,不仅使我们无须去了解Java应用之外的烦琐细节,还增加了Java语言的扩展性。
  • 本地方法栈:本地方法栈用于管理本地方法的调用
  • JVM的主要内存区域分为堆内存和非堆内存,非堆内存在不同JDK版本中的实现是不一样的。堆内存区域又进行了细致的划分,主要目的是为了优化垃圾收集。
  • 对象在堆内存中的分配过程和策略,
  • 新生代是大部分对象诞生、成长和消亡的区域。对象在这里产生、应用,最后被垃圾回收器收集、结束生命。
  • 老年代放置生命周期较长的对象,通常都是从Survivor区域筛选复制过来的Java对象,也可能是大对象直接分配到老年代。
  • GC的分类,
  • 当GC只发生在新生代中,回收新生代对象的行为被称为Minor GC。
  • 当GC发生在老年代时,则被称为Major GC或者Full GC。程序正常运行的情况下,Minor GC的发生频率要比Major GC高很多,即老年代中垃圾收集发生的频率要大大低于新生代垃圾收集的频率。
  • JIT编译器通过逃逸分析来优化对象的分配,经过逃逸分析之后的代码,如果对象没有发生逃逸行为,则可能会发生栈上分配、同步省略和标量替换行为。
  • 方法区
  • 了解运行时数据区中方法区、堆、栈之间的交互关系,并详细讲解了方法区的相关知识。
  • 方法区(Method Area)是可提供各个线程共享的运行时内存区域,它用于存储已被虚拟机加载的类型信息、常量、即时编译器编译后的代码缓存等。
  • 方法区的大小不必是固定的,在JDK 8及之后是通过“-XX:MetaspaceSize”和“-XX:MaxMetaspaceSize”设置元空间的初始分配空间和最大分配空间。
  • 常量池和运行时常量池的存储内容。在JDK的版本升级中方法区也逐渐地进行着调整,由永久代变成了元空间。方法区同样也是需要垃圾回收的,主要回收常量池中废弃的常量和不再使用的类型信息。
  • 对象的实例化内存布局与访问定位
  • 了解多种创建对象的方式,如使用new关键字、Class的newInstance()方法、Constructor类的newInstance()方法等。
  • 了解创建对象的步骤,总共分为6步:
  • 第1步是判断对象对应的类是否加载、链接、初始化;
  • 第2步是为对象分配内存;
  • 第3步是处理并发安全问题;
  • 第4步是初始化分配到的空间;
  • 第5步是设置对象的对象头;
  • 第6步是执行init方法进行初始化。
  • 了解对象的内存布局,并且使用案例讲解了对象在内存布局中的内容。
  • 访问对象的两种主流方式,分别是使用句柄访问和使用指针访问,其中经常使用的HotSpot虚拟机主要使用指针访问。
  • 直接内存
  • 直接内存的概念,直接内存来源于NIO,它是一块堆外内存,这些内存直接受操作系统管理。
  • 从结果来看,NIO的数据传输效率要比IO高,说明直接内存的使用可以提高数据传输效率,如果在读写频繁的场合可以考虑使用直接内存。
  • 直接内存不受JVM管理,相对于堆内存来讲更加难以控制,使用直接内存就意味着失去了JVM管理内存的可行性,需要由开发人员管理,所以在使用直接内存的时候要注意空间的释放。
  • 执行引擎
  • 执行引擎在JVM中起到的作用,执行引擎充当了将class文件中的内容翻译为机器语言的译者,使得物理机器可以识别,进而使得程序可以执行。
  • HotSpot VM中的执行引擎同时存在解释器和JIT编译器,即代码可以解释执行,也可以编译执行。从执行效率上讲,编译执行要比解释执行的效率高。
  • 从JVM启动时间来看,解释器可以首先发挥作用,而不必等待JIT全部编译完成后再执行,这样可以省去许多不必要的编译时间编译执行。
  • 字符串常量池
  • String类的创建方式及其特性。字符串的分配和其他的对象分配一样,耗费高昂的时间与空间代价。
  • JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化,使用字符串常量池实现对字符串常量对象的共享以节省大量的内存空间。

 

 

三. GC垃圾回收

  • 垃圾收集概述
  • 垃圾收集相关算法
  • 垃圾收集相关概念
  • 垃圾收集器

垃圾回收器基础:可达性分析、方法区的回收、垃圾回收算法和GC策略
 

四. 字节码与JVM类加载

  • class文件结构
  • 字节码指令集与解析
  • 类的加载过程
  • 类加载器

JVM基础(2) - java类生命周期、类加载原理与自定义类加载器
 

五. 调试与诊断

  • 命令行工具
  • JVM监控及诊断工具
  • JVM运行时参数
  • GC日志分析
  • OOM分类及解决方式

【JVM】JVM堆占用情况分析(频繁创建的对象、内存泄露等问题)、jmap+jhat、jvisualvm工具使用

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明
 

六. 性能调优

(针对 G1 )JVM常用参数讲解:-XX,-X,-D 的区别与常用JVM配置 +应用程序配置实例+ 调优思路

 

这篇关于【java虚拟机】JVM知识框架快速一览的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050230

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及,智能家居行业正迎来新的发展机遇,众多厂商纷纷投身于 Matter 产品的研发与验证。然而,开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。  乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行业洞察力,推出了全面的 Matter 解决方案,包含基于乐鑫 SoC 的 Matter 硬件平台、基于开源 ESP-Matter SDK 的一

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus