"运行时包"阻隔不同ClassLoader加载的类之间互相访问
.class文件的校验过程
1:class文件的结构检查,比如必须以0xCAFEBABE开头,文件长度与声明长度是否匹配等。
2:数据类型的语义检查,比如:返回类型、final类的强制规则、参数个数是否合法。
3:字节码验证,字节码流代表java的方法(由操作码和操作数组成),栈桢
4:符号引用的验证,验证所关联(引用)的类、方法、字段是否正确,即使不正确也只会在真正调用的时候才抛相应的异常
一个线程创建一个Java栈,当调用一个方法时则压入一个栈桢到该线程的java栈中,方法返回时就弹出。
栈桢由三部分组成:局部变量区(参数、局部变量)、操作数栈和帧数据区
jvm规范中,int 0表示false,非0整数表示true; boolean [] ,则是用byte[]来标识
装载(查找并装载类型的二进制数据)
装载阶段的三个基本动作:
1:通过该类型的全限定名,产生一个代表该类型的二进制数据流
2:解析这个二进制数据流为方法区内的内部数据结构
3:创建一个标识该类型的java.lang.Class类的实例
-->
连接(验证(正确性)-->准备(为类变量分配内存地址,并为其初始化默认值)-->解析(将符号引用转换为直接引用)(可选))
-->
初始化(把类变量初始化为正确初始值)
初始化一个类包含两个步骤:
1:如果存在直接超类,且直接超类还没初始化,就先初始化直接超类
2:如果类存在一个类初始化方法,就执行此方法
初始化接口并不需要初始化它的父接口
方法区和堆都可以是不连续的内存区
引用类型:
1:类类型
2:接口类型
3:数组类型
方法区存储类型信息、类(静态)变量
类型信息包括:
1:类型的全限定名
2:类型的直接超类的全限定名
3:类型是类类型还是接口类型
4:类型的访问修饰符public /abstract /final
5:任何直接超接口的全限定名的有序列表
....
x:该类型的常量池
x:字段信息
x:方法信息
x:除了常量以外的所有类(静态)变量
x:一个到类ClassLoader的引用
x:一个到Class类的引用
.class文件的大致结构:
1:魔数:0xCAFEBABE;快速区分某个class文件是否是Java class文件
2:minor_version和major_version;辅助版本号和主版本号
3:constant_pool.count和constant_pool;
4:access_flags
5:this_class
6:super_class
7:interfaces_count和interfaces
8:fields_count和fields
9:methods_count和methods
10:attributes_count和attributes
常量池:
1:CONSTANT_Utf8_info表
2:CONSTANT_Integer_info
3:CONSTANT_Float_info
4:CONSTANT_Long_info
5:CONSTANT_Double_info
6:CONSTANT_Class_info
7:CONSTANT_String_info
8:CONSTANT_Fieldref_info
9:CONSTANT_Methodref_info
10:CONSTANT_InterfaceMethodref_info
11:CONSTANT_NameAndType_info
主动使用的六种情形,将会导致类或接口的初始化:
1:创建某个类的新实例时(new\反射\克隆\反序列化)
2:调用某个类的静态方法时
3:使用类或接口的非常量静态字段,或对该字段赋值时(用getstatic/putstatic指令时),用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式
4:当调用Java API中的某些反射方法时,如Class中的方法或者java.lang.reflect包中的类的类方法
5:当初始化某个类的子类时
6:当虚拟机启动时某个被标明为启动类的类(即含有main()方法的那个类)
任何一个类的初始化都需要它的超类在此之前已经初始化,而接口,只有在某个接口所声明的非常量字段被使用时,该接口才会被初始化,而不会因为其子接口或子类的初始化而被初始化。
如果一个字段既是static的,又是final的,并且使用一个编译时常量表达式初始化,使用这样的字段,就不是对声明该字段的类的主动使用
GC种类:
1:引用计数,对象引用计数器
2:跟踪收集,图,标记并清除
3:压缩收集,程序-->句柄-->内存地址,移动碎块
4:拷贝收集,分配实际内存的2倍,同时使用的始终只有一块,当其中一块满的时候,停止应用程序,拷贝并整理碎片到令一块内存,切换工作的内存,再恢复程序
5:按代收集,把堆按对象的生命周期长短分成不同的代,GC最频繁地收集最年轻的代,如果对象多次没有被收集,则会标识为更高一代(生命周期更长)
分享到:
相关推荐
《JVM笔记(阳哥)》是一份深入探讨Java虚拟机(JVM)的资料,由阳哥精心整理。这份笔记涵盖了JVM的基础概念、内存管理、类加载机制、性能优化等多个方面,对于理解Java程序的运行机制以及提升开发效率具有重要的...
通过观看"jvm视频",你可以直观地了解这些概念,并通过"jvm笔记"加深理解和记忆。理论学习后,实践操作是巩固知识的关键,尝试在实际项目中应用这些知识,解决性能问题,优化JVM配置,将使你对JVM的理解更加深入。
JVM 笔记 今天,我们要讨论的是 JVM 的笔记,这个笔记包括了 JVM 的基本结构、类加载机制、类文件格式等内容。 首先,让我们来看一下 JVM 的基本结构。JVM 可以分为三个部分:CLASS LOADER、RUN TIME DATA AREA 和...
### 深入解析 JVM 内存区域 #### 一、Java内存区域概述 Java虚拟机(JVM)作为Java程序的运行环境,负责管理和分配内存资源。为了更好地理解和掌握JVM内部的工作机制,本篇文章将重点介绍JVM中的几个关键内存区域:...
【标题】"ImagesForJVM-JVM笔记图片" 提供的是一系列关于Java虚拟机(JVM)的图像资料,这些图片通常用于辅助理解和学习JVM的工作原理。JVM是Java程序运行的基础,它负责解释执行Java字节码,使得Java能够实现跨平台...
JVM笔记.html
jvm笔记 1、jvm总体架构.pdf 2、堆内存内部结构.pdf 3、有关内存的常用配置参数.pdf 4、有关内存溢出和内存泄漏的知识点.pdf 5、jvm里的垃圾回收机制.pdf 6、jvm优化知识点升级和配置总结.pdf 7、Tomcat调优...
狂神说JVM笔记
观宋红康老师视频所著JVM笔记
### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...
【JVM 体系结构概述】 Java 虚拟机(JVM)是Java应用程序的核心,它作为操作系统上的一个抽象层,使得Java代码可以在任何支持JVM的平台上运行,无需关心底层系统的具体细节。JVM主要由以下几个部分构成: 1. 类...
这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键知识点的详细解析: 1. **JVM概述**: - JVM是Java平台的核心组成部分,它是一个运行Java字节...
jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM之前,我们先要明白它的核心概念:类加载、内存管理、执行引擎、垃圾回收以及性能优化。 一、类加载机制 JVM...
### JVM中篇笔记知识点 #### 一、Class 文件结构 ##### 1. 概述 - **字节码文件的跨平台性** - Java 的跨平台性体现在 "Write Once, Run Anywhere" (WORA),即一次编写,到处运行。Java 语言编写的源代码在编译...
### JVM基础知识及类加载机制详解 #### Java程序的运行流程 Java程序的执行流程主要包含以下几个步骤: 1. **编译**: 将`.java`源文件编译为`.class`字节码文件。 2. **打包**: 将多个`.class`字节码文件打包为一...
Java是一种高级的面向对象的程序设计语言,它具有广泛的应用和强大的跨平台特性。Java语言于1995年由Sun公司推出,由Java之父詹姆斯高斯林设计。Java的设计目标是提供一种易学易用、功能强大的编程语言,使开发人员...
内容包含: 1、JAVA SE 2、MySQL + JDBC 3、JAVA WEB 4、Mybatis 5、SSM 6、大前端 7、Vue 8、SpringBoot 9、Spring Security ...12、JVM 13、JUC 14、Git 15、Linux 16、Redis 17、ElasticSearch 18、Docker
内含 javascript, java web, java基础, mybatis, MySQL, Redis, spring, spring boot, spring mvc, vue的md格式笔记与pdf文件
### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...