jvm相关知识总结

硬件->操作系统->JVM->java程序
JVM是在操作系统以上的

从操作系统角度看:jvm 就是一个进程

1.JVM从OS申请资源
2. JVM使用线程调度

JVM整体架构
Hello.class 从硬盘到CPU的过程
1.加载(从硬盘到内存)
2.执行

1.执行的入口(从哪里开始)
2.翻译(抽象的字节码->指令)
3.使用CPU执行

	4.

JVM:
1.类加载器
~负责类的加载管理
~执行引擎
:字节码的执行
~内存管理器:
在这里插入图片描述
1.类的加载
1.什么是类加载?为什么需要类加载?
2.什么情况下会触发类的加载?–用到了一个类,同时类还未被加载

1.调用类的静态方法
2.实例化类对象
3.子类被用到
4.构造Class对象:使用反射触发类的加载 Class.forName();

3.类被加载到内存的什么区域?--逻辑上,方法区
4.类加载的流程:
	加载->链接(类和类的链接)->初始化(静态属性初始化)
5.初始化的执行流程
	1.父类的初始化优于子类的初始化
	2.按照书写顺序:定义时的初始化,静态代码块
6.类加载过程中,JVM是如何找到类文件的? 类名<->类文件
	com.xxxYuan.Hello  <->com/xxxYuan/Hello.class
相对于:类查找路径 CLASSPATH环境变量可以指定:java - classpath
	如果没有指定,以当前路径为根进行查找
自定义ClassLoader,引导JVM去查找
7.类加载过程中的双亲委派机制
	JVM中,默认情况下有三个不同的类加载器
		1.BootstrapClassLoader:rt.jar 这些类JRE提供的标准类
		2.ExtenstionClassLoader:extension目录下,JRE提供的扩展类
		3.ApplicationClassLoader:我们的类.通过maven加载第三方类
	当加载器收到加载请求时
		1.判断类是否已经被加载过
		2.如果未被加载,优先被类加载器请求委派给parent类加载器进行处理
		3.如果parent类加载器未加载到类,则自己进行加载
		4.如果依旧没加载,则ClassNotFound,NoClassDefException
	双亲委派被破坏的场景tomcat
		1.Tomcat定义了自己的类加载器
	2.Tomcat的类
		1.JRE中的类
		2.Tomcat自己的类
		3.每个webapp需要加载的类
根/
	静态资源
	WEB-INF/
		web.xml
		classes/
			我们的代码的类文件
		lib/
			*.jar依赖的第三方包`在这里插入代码片`
JVM选择类加载器:目的执行
1.重点:	
          	1.什么是类加载
          	2.类加载的路径 CLASSPATH -classpath
          	3.初始化顺序
          	4.双亲委派模型 字符串变量 	字符串对象 执行引擎: 	while(true){
		1.根据PC(JVM运行内存区域中的一个)	读取下一条指令的字节码
		2.根据JVM中提前写好的代码,对字节码进行翻译->一条、多条指令
		3.利用CPU提供的指令集,OS提供的系统调用 }

1.运行时内存区域划分 	规范划分:PC、栈、堆、方法区、运行时常量池 	实践划分(Hotspot虚拟机): 			OpenJDK(开源) 			Hotspot(闭源) 			多了一个Native Memory(本地内存)
				分区管理		 	为什么划分?方便管理 ,不同区域,不同的管理机制
2. 	线程间私有:PC、堆 	线程间共享:堆、方法区、运行时常量池 
3. 区域和语言中的关系:
栈:FILO、元素、栈帧、
Frame:保存了什么
	1.局部变量
	2.操作数栈
	3.动态链接
	4.返回地址
代表了方法的一次执行过程
内存管理(分配/回收;申请/释放)
没有开发JVM之前的时代 -C语言
	开发人员负责申请malloc ,负责释放free
有了JVM之后,申请权留给程序员,释放权利被收回
	其实是一个使用权和是释放权被分离的过程
分区域探讨回收:
	1.PC
	2.栈:栈帧的申请释放,明确
	3.堆
	4.方法区
		当类被加载时
	5.运行时常量
		类加载时进行申请,类加载时被释放
JVM中的堆内存管理
	1.堆内存管理的基本单位是对象---GC	Garbage Collect Garbage Collector 回收对象的讨论研究
	2.哪些对象是活着的?哪些对象是死去的?
		几种错误的情况:
			1.把活着的对象回收了(崩溃,致命
			2.忘记回收死去的对象(内存泄漏,不致命
	现在或者以后会用到的对象是活着的。现在和以后都不在用的对象是死去的。
	
	Java程序员可以直接接触到Java中对象么?不行的,只能通过引用来接触java对象
	没有引用指向的对象,一定是死对象,有引用的是无法确定。
	所以,回收没有引用的对象,即可(一定死对象)
3.需要一套机制,搞清楚哪些对象没有被引用---引用计数法---JVM没有采用
	1.引用有效性可以明确标识
		1.局部变量 ---方法执行结束
		2.属性	---所在对象呗回收时
		3.静态属性 ---类被卸载时
	2.VM 设计对象时,在对象内部保存一个数值
	
	3.回收对象的时机---引用失效 rc == 0 ,该对象可以被回收
	引用计数法:
		两个互为成引用的对象失效
		计数器都为1,但没有存在意义了,但也无法被判定为可回收 
		
	引用:
		引用用来决定对象的生死
		
	实际应用中:
		这两个功能可能出现分离!
	引用被继续分类: ---引用概念被泛华
垃圾回收(GC)
	GC执行流
		分析 , 回收,整理
	GC算法大思路
		由于内存碎片的出现,导致空间无法被有效利用,所以,有必要回收过程中加入整理操作
		进行对象的整理,比较慢
		针对这点,提出了复制算法(前提,大量对象,活不过一个GC)
		所以分两类
			1.标记-清除-整理
			2.标记-复制
		GC算法进行分代处理
			新生代 标记复制 Minor Gc
			老年代 标记清除整理 Major Gc
		只针对新生代做GC:Minor Gc
		只针对老年代做GC:Major Gc
			一般实现MajorGC 都是由于一次Minor GC引发的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值