java-jvm类加载-001笔记

java 虚拟机运行时数据区
方法区-----虚拟机栈-----本地方法栈------堆------程序计数器------执行引擎-------本地库接口-----本地方法库
---------几大模块-----------------------------
jvm类加载机制
jvm内存区域
jvm内存模型
GC之对象生死
垃圾收集算法
垃圾收集器
内存分配策略
调优工具
  --jconsole
  --jvisualvm
调优GC参数
---类加载-----------------------
类型的加载,连接与初始化过程都在程序运行期间完成的,提供了更大的灵活性,增加了更多的可能性
--java虚拟机与程序的生命周期
在如下几种情况下,java虚拟机将结束生命周期
1)执行System.exit()方法
2)程序正常执行结束
3)程序在执行中遇到异常或者错误而异常终止
4)由于操作系统出现错误而导致java虚拟机进程终止
--------5步---------
加载:查找并加载类的二进制数据
连接
  --验证:确保被加载的类的正确性
  --准备:为类的静态变量分配内存,并将其初始化为默认值
  --解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
使用
卸载
-----
java程序对类的使用方式可以分为2种
1--主动使用
2--被动使用
所有的java虚拟机实现必须在没个类或接口被java程序"首次主动使用"时
才初始化它们
主动使用(7种)
--创建类的实例
--访问某个类或接口的静态变量,或者对该静态变量赋值
--调用类的静态方法
--反射
--初始化一个类的子类
--java虚拟机启动时被标明为启动类的类--类似main,程序入口
--jdk1.7开始提供动态语言支持
java.lang.invocke.MethodHandle实例的解析结果
REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有初始化
则初始化
助记符--getstatic ---putstatic--invokestatic
被动使用:不会导致类的初始化,但是可能会加载和连接
-----------类的加载----------
加载.class文件的方式
-从本地系统中直接加载
-通过网络下载.class文件
-从zip.jar等归档文件中加载.class文件
-从专有数据库中提取.class文件
-将java源文件动态编译为.class文件
----
对于静态字段来说,只有直接定义了该字段的类才会被初始化
当一个类在初始化时,要求其父类全部已经初始化完毕
-XX:+TraceClassLoading,用于追踪类的加载信息并打印出来
-XX:+<option>,表示开启option选项
-XX:- <option>, 表示关闭option选项
-XX:<option>=<value>,表示将option选项的值设置为value
----------------
final:表示常量,在编译阶段,会存入调用那个方法所在类的常量池中
本质上,调用类并没有直接引用到定义常量的类。因此并不会触发定义常量类的初始化
注意:这里指的是将常量存放到了调用方法的类的常量池,可以删除编译后的class文件
javap -c :反编译
助记符:

  ldc表示将int,float或是String类型的常量值从常量池中推送至栈顶
  bipush表示将单字节(-128-127)的常量值推送至栈顶
  sipush将一个短整型常量值(-32768-32767)推送至栈顶
  iconst_1表示将int类型1推送至栈顶(iconst_m1-iconst_5)(-1~5)
---------类加载器-------
com.sun.org.apache.bcel.internal.generic;internal表示内部使用
当一个常量值并非编译期可以确定的,那么其值就不会被放到调用类的常量池中。
这时候在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化
---
对于数组实例来说,其类型是有jvm在运行期间动态生成,表示[
这种形式,动态生成的类型,其父类类型就是Object
对于数组来说,JavaDoc经常将构成数组的元素称为component,实际上就是将数组降低一个维度后的类型,
助记符:
  anewarray:表示创建一个引用类型的(如类,接口,数组)数组,并将其引用值压入栈顶
  newarray:表示创建一个指定的原始类型(如int,float,char等)的数组。并将其引用值压入栈顶。

接口初始化:

 

当一个接口初始化时,并不要求其接口都完成初始化
只有在真正使用到父接口的时候(例如引用接口中所定义的常量),才会初始化
--加载:就是把二进制形式的java类型读入java虚拟机中
--验证
--准备:为类变量分配内存,设置默认值,但是在到达初始化之前,类变量都没有初始化为 真正的初始值
--解析:解析过程就是在类型的常量池中寻找类,接口,字段和方法的符号引用,把这些符 号引用替换成直接引用的过程
--初始化:为类变量赋予正确的初始值
--类实例化:为新的对象分配内存,为实例变量赋默认值,为实例变量赋正确的初始值
java编译器为它编译的每一个类都至少生成一个实例初始化方法,在java的class文件中,
这个实例 初始化方法被称为"<init>".针对源码中的每一个类的构造方法,java编译器都产 生一个<init>方法
--类的加载的最终产品是位于内存中的Class对象
--Class对象封装了类在方法区内存的数据结构,并且向java程序猿提供了访问方法区内的数 据结构的接口
---类的加载-----
有两种类型的类加载器
java虚拟机自带的加载器
根类加载器(Bootstrap)
扩展类加载器(Extension)
系统(应用)类加载器(System)
用户自定义的类加载器
java.lang.ClassLoader的子类
用户可以定制类的加载方式
--类加载器并不需要等到某个类被"首次主动使用"时再加载它
--jvm的规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的
--过程中遇到了.class文件缺失或者存在错误,类加载器必须在程序首次主动使用该类时
才报告错误(LinkageError错误)
--如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
-------
1)类被加载后,就进入连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
2)类的验证内容
-类文件的结构检查
-语义检查
-字节码验证
-二进制兼容性的验证
--类的初始化时机----
只有当程序访问的静态变量或者静态方法确实在当前或者当前接口中定义时,才可以认为是对类或者接口的主动使用

类加载器的关系,依次为包含关系

 

转载于:https://www.cnblogs.com/liufei-90046109/p/11584537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值