欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JVM学习笔记

程序员文章站 2024-01-09 22:48:46
目录1、什么是JVM1.1、概念1.2、为什么要学习JVM2、JVM体系结构2.1、JVM体系结构概览1、什么是JVM1.1、概念Java Virtual Machine:Java虚拟机可以看作是一台虚拟的计算机,就像真实的计算机那样,有着自己的指令集以及各种运行时内存区域。由于某些语言不具有跨平台性,而Java虚拟机实现了跨平台运行,因为计算机只能识别0101之类的机器码,而Java虚拟机将特定格式的字节码生成不同平台的机器码,从软件层面屏蔽在不同操作系统在底层硬件和指令的区别,确保了字节码能在不同...

1、什么是JVM

1.1、概念

Java Virtual Machine:Java虚拟机可以看作是一台虚拟的计算机,就像真实的计算机那样,有着自己的指令集以及各种运行时内存区域。由于某些语言不具有跨平台性,而Java虚拟机实现了跨平台运行,因为计算机只能识别0101之类的机器码,而Java虚拟机将特定格式的字节码生成不同平台的机器码,从软件层面屏蔽在不同操作系统在底层硬件和指令的区别,确保了字节码能在不同平台运行

1.2、为什么要学习JVM

在Java应用程序上线后,会出现一些问题,除去网络系统本身的问题,往往就是Java虚拟机的内存出现问题,要么是内存溢出或GC频繁出现响应慢,所以我们要学习Java虚拟机内存数据模型以及垃圾回收算法等

2、JVM体系结构

2.1、JVM体系结构概览

JVM学习笔记

2.2、类加载子系统

作用: 类加载子系统负责从文件系统或网络系统中加载clss文件,class文件在开头有特定的文件标识,加载为clss文件代表类的二进制字节流,将字节流代表的静态存储结构转换为方法区的运行时数据,在内存中会生成一个代表这个类的java.lang.Class对象作为方法去这个类各种数据的访问入口,类加载器只负责clss文件的加载,是否可以运行取决于Excution Engine
JVM学习笔记

2.3、运行时数据区

2.3.1、程序计数器

用于计数,在冯 洛伊曼计算机体系结构主要内容之一 就是程序预存储,计算机自动执行,处理器要执行的程序都是以二进制的代码序列方式存储在计算机的存储器中,处理器将这些代码逐条的取出到处理器中再编译执行,用以完成整个程序的执行。为了连续执行,处理器需要知道下一次执行代码的地址值,而程序计数器正是起到该作用,所以程序计数器也被称为指令计数器,不断更新到下一条指令

2.3.2、虚拟机栈

概念:每个线程运行时所需的内存空间,称为虚拟机栈。每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存,每个线程只能有一个活动栈帧,对应着正在执行的方法
栈帧:由局部变量表、操作数栈、动态链接、正常返回与异常返回

  • 局部变量表:存放局部变量的列表,一个局部变量可以保存为boolean、byte、short、float、return和returnAddress的数据,两个局部变量可以保存一个类型为long和double的数据,局部变量表用索引来进行定位访问
  • 操作数栈:当一个方法刚执行时,操作数栈是空的,随着方法执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,在随着程序执行将栈中元素出到栈局部变量表或返回给方法调用者,也就是入栈和出栈操作,一个完整的方法执行往往包含多个入栈和出栈的过程
  • 动态链接:在clss文件中描述了一个方法调用其他方法或则访问成员变量是通过符号引用来表示的,动态链接就是将这些符号引用所表示的方法转换为实际方法的直接引用
  • 方法的返回地址:无论方法采用哪种返回方式,在方法退出后都需要返回到方法被调用的位置,程序 才能继续执行

2.3.3、本地方法栈

定义:使用native修饰的方法叫做本地方法,类似于虚拟机栈,也是线程私有的

2.3.4、堆

作用:用于存放对象的内存区域

特点

  • 被所有线程共享的一块区域,在虚拟机启动时创建
  • 垃圾回收的主要区域
  • 在逻辑上划分为“新生代”和“老年代”,新生代分为Eden、ServivorFrom和ServivorTo三个区
  • 大小是可扩展的,通过-Xms与-Xmx控制最小和最大内存

堆内存诊断

  • jps:查看当前系统中有哪些Java进程
  • jmap:查看堆内存中某一时刻占用情况(jmap -heap 进程id)
  • jconsole:图形界面,内置Java性能分析器,多功能检测工具,可连续监测

2.3.5、方法区

简介:在逻辑上是堆的一部分,但是在实现上不强制它的位置,Java8取消了永久代变成了元空间,元空间使用的是本地内存,用于存储每个类的结构,例如运行时常量池、Class、ClassLoader、字段、方法、构造函数的代码以及用于类和实例初始化及接口初始化的特殊方法等

2.4、执行引擎

2.4.1、垃圾回收

本文地址:https://blog.csdn.net/ylsn666/article/details/114239859