关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构

2024-08-23 01:58

本文主要是介绍关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

作为一个爱好Java的程序猿,自然少不了对JVM的学习和研究,《深入理解Java虚拟机》一书,大概从头到尾完整地看了四五遍,有些地方感觉讲的粒度比较粗,但只是少数,总体而言,这本书讲解的非常棒,不少东西都是看了第二次,甚至第三次之后才有了进一步的理解。

走进Java-Java技术体系

从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关程序都属于Java技术体系中的一员。但是,如果仅从传统意义上看,Sun官方所定义的Java 技术体系包括以下几个组成部分。

  • Java程序设计语言
  • 各种硬件平台上的Java虚拟机
  • Java API类库
  • Class文件格式
  • 来自商业机构及开源社区的第三方Java类库

    这里,还可以进一步细分,
    Java体系

      其中,JVM(Java Virtual Machine,Java虚拟机)可以说是支撑整个Java技术体系运行的关键所在。下图是Java虚拟机的整体结构,主要描述的是从编写好的Java代码(.java文件),经过编译器编译形成字节码文件(.class文件),字节码文件通过类加载器加载到运行时数据区中,并由执行引擎按照代码执行顺序逐步执行。

    Java虚拟机

      不同于C/C++,Java程序员将内存控制的权力交给了Java虚拟机,因此,为了能够更好的了解虚拟机对内存的使用,以及对内存泄漏和溢出等方面问题的定位,有必要深入理解Java虚拟机的内存管理机制。

      而Java虚拟机最主要的内存区域,便是运行时数据区,也就是下图中红色箭头所指的区域(Runtime Data Areas)。

运行时数据区

  这部分区域,便是Java程序在运行时,所有涉及的变量、方法、对象存储的地方。我们可以通过下图更进一步了解运行时数据区的内部结构划分。
  
运行时数据区结构

从上图可知,运行时数据区总共分为5部分:方法区、虚拟机栈、本地方法栈、堆、程序计数器。下面将简单介绍一下各部分在运行时数据区中的主要作用。后续将做进一步的详细介绍。
  1.程序计数器:
  程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,如果了解计算机处理器内部结构的同学,其实可以很容易理解,处理器中会有32个32位的寄存器,寄存器是用来进行各类计算的基本单元,而程序计数器本质便是一个32位的寄存器,它存放的是当前字节码执行的行号,同时利用程序计数器,也能够定位到下一句即将执行的语句。
   又因为Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,因此在任何一个确定的时刻,一个处理器都只会执行一条线程。因此,为了线程切换后能够恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
   2.Java虚拟机栈:
   与程序计数器一样,虚拟机栈也是线程私有的,虚拟机栈主要描述的是Java方法执行的内存模型,每个方法在执行的同时,会创建一个栈帧,每个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口信息等。而方法从调用到完成的阶段,就是入栈到出栈的过程。
   3.本地方法栈:
   本地方法栈与虚拟机栈的作用非常相似,他们之间区别不过是虚拟机栈为虚拟机执行Java方法提供服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
   4.Java堆:
   对于大多数应用来说,Java堆是Java虚拟机中所管理内存中最大的一块,因为Java堆中存放了所有的对象实例和数组。且Java堆被所有线程所共享,在虚拟机启动的时候会自动创建,这块区域也是垃圾回收时的重点区域。
   5.方法区:
   方法区与Java堆一样,被各个线程所共享内存,它用于存储虚拟机加载的类信息、常量、静态变量、即时编译器变异后的代码等数据。这里需要额外提及的是运行时常量池,它是方法区的一部分,Class文件中除了存放类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译阶段生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

          

这篇关于关于Java虚拟机二三事(一)---Java技术体系及JVM内存结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致