绚丽的网站欣赏,网站推广工作,建设机械网站资讯,外包工是临时工吗1.什么是JVM#xff1f;
JVM就是Java虚拟机【Java Virtual Machine】#xff0c;简称JVM。主要部分包括类加载子系统#xff0c;运行时数据区#xff0c;执行引擎#xff0c;本地方法库等#xff0c;接下来我们一一介绍
2.类加载子系统
JVM中运行的就是我们日常写的JA…1.什么是JVM
JVM就是Java虚拟机【Java Virtual Machine】简称JVM。主要部分包括类加载子系统运行时数据区执行引擎本地方法库等接下来我们一一介绍
2.类加载子系统
JVM中运行的就是我们日常写的JAVA代码代码经过编译加生成.class文件在经过类加载子系统加载到内存中如图
3.JVM运行时数据区 3.1方法区内存共享
存储的就是类对象包括类方法和对象方法 存储数据是公共的所有线程都可以访问这个区域
补充方法区别称 JDK7称为永久代 JDK8及以后称为元空间
补充**如何区别类方法和对对象方法** 对象方法调用时会有一个隐式this引用表示当前对象自己而类对象全局统一。
3.2堆内存共享
用来存放在代码中用new关键字创建的对象。也是JVM中内存使用最大的区域。
3.3JAVA虚拟机栈线程私有
每创建一个线程都会在内存中创建一个对应的虚拟机栈栈中存放的是栈帧。 该线程每调用一个方法虚拟机中就会入栈一个栈帧栈帧中存储的信息与该方法息息相关主要包括局部变量表操作站栈动态连接方法返回地址如图 所以当某线程虚拟机栈空了也就说明该线程中的方法已经执行完毕反之亦然。
3.4本地方法栈
调用本地方法时使用的栈
3.5程序计数器线程私有
用来记录线程当前执行到了哪一行下次CPU调度时从计数器位置开始执行多线程
搞懂了这些部分分别是做什么的我们再来说**.class文件时如何被JVM加载并运行**
1.类加载子系统把.class文件加载到运行时数据区。
2.将类对象类方法和对象方法存在方法区后续new对象可以直接从这里找到模板以便进行对象创建操作。
3.new 出来的对象全部放在堆区。
4.创建的每个线程分配一个虚拟机栈线程中被调用的方法信息记录在栈帧中并依次入栈可以说栈中存的是线程对方法的调用层级。
5.本地方法栈中存的是本地方法的调用层级。
6.程序计数器记录的是当前线程的执行的行号。
4.JVM类加载过程 4.1加载
通过类的全限定名找到所有的.class文件加载到内存中
4.2验证
验证.class文件是否符合JVM标准
4.3准备
为静态变量以及静态方法分配内存空间并按照数据类型设置初始值例如int 初始值为0。
4.4解析
JVM把常量池中的符号引用例如int 符号引用为I替换为真实引用
4.5初始化
执行类的初始化代码被static修饰的
4.6使用
使用的也就是刚刚加载的类所以使用阶段也是new对象执行构造方法和父类构造方法的阶段。
4.7卸载
程序停止时–从JVM中卸载。
5.双亲委派模型
双亲委派模型是Java类加载器的一种工作模式该模式主要用于JVM类加载阶段用于保证JDK中定义的类不被恶意修改。以下是它的工作图 具体流程 1.当创建一个类时先从应用加载器开始向上转发一直到启动加载器 2启动加载器在自己路径下找这个类若找到则加载没有则向下转发给扩展加载器 3.扩展加载器在自己路径下找这个类若找到则加载没有则向下转发给应用程序加载器 4.应用程序加载器在自己路径下找这个类找到则加载找不到则报异常或错误
6.垃圾回收
说完了类的加载和卸载我们来讲对象是如何被回收的毕竟我们前面讲堆区是JVM中使用内存最大的区域为什么最大因为程线程中创建的各种对象多呗有时一个对象被创建可能仅仅使用一次就不用了对于这些对象我们要及时回收不然放那不管是占内存的。
那垃圾回收中的“垃圾”其实也就是不再使用的对象垃圾回收也就是回收对象占用的堆内存。
所以问题就在于如何标识对象是否死亡
6.1引用计数算法
核心思想对于堆中对象引用一次计数加一消除引用一次计数减一当堆中对象引用计数为0时表示该对象已经死亡。
该算法缺点内存泄漏----堆中某个对象对应的内存空间永远也回收不了。 举个例子 经过上诉一番操作t1对象和t2对象虽然还未死但是t1.instance所引用的对象永远也访问不了那这个内存就回收不了所以这种算法我们一般不用。
6.2可达性分析算法
核心思想通过某一个根节点GC root出发访问不到某个对象则判定该对象死亡本轮GC标记下轮GC回收内存空间。
6.3标记-清除算法
判定哪些对象已死亡需要回收我们OK了那么如何回收死亡对象呢
首先登场的时标记-清除算法工作原理如下图 GC一次垃圾回收垃圾回收的时候会停止所有用户进程STWStop The World
缺点会产生大量不连续的空间碎片看图也能看出来 导致如果有一个大对象将会没有足够的内存空间存放-------》导致再次触发GC-------》再次触发STW而GC的时间是不可控的一秒一天一周都有可能随着计算机和网络的发展这样的时间成本是不可接受的。
6.4复制算法
工作原理如下图 核心思想将内存区域划分为两个大小相等的区域区域1来放对象区域2暂时空闲当GC开始时先将区域未死亡对象复制到区域2并按照内存地址顺序整理好然后全面清除区域1完成一次完整GC。
优点解决了内存空间不连续的问题。 缺点空间利用率不高只有一半如果要存储8G对象就要准备至少16G空间。
6.5标记整理算法
核心思想每回收一次对象后将剩余对象向一端整理。具体如下图 核心思想在回收死亡对象之后将剩余对象向一端移动。 优点空间利用率提升了不再是50%了。 缺点在移动对象的过程中效率势必会受很大影响。
6.6分代算法GC中真正使用的算法
核心思想将整个内存区域分为新生代占内存三分之一和老年代占内存三分之二 新生代用来存放刚new 出来的对象大部分“朝生暮死”老年代用来存放在新生代经历多次GC而未被回收的对象。 新生代采用复制算法老年代采用标记-整理算法。 新生代又分为Eden区From区和To区Eden区占新生代内存的五分之四剩余由From区和To区占有。
具体回收过程如下图 每个对象的对象头中有一个字段记录着该对象“年龄”每GC一次而未被回收则年龄加一在新生代中年龄超过某个特定值一般默认为15则会被强制移到老年代。