JVM的实现机制,体系结构图。

JVM在哪里?
运行在操作系统之上。
在这里插入图片描述
在这里插入图片描述

  1. 首先利用工具编写Java源代码,源文件后缀名为.java;
  2. 然后通过编译器将源代码转化成字节码文件,字节码文件后缀为.class;
  3. 再通过类加载器将这些字节码文件加载到JVM中由CPU去执行;

JVM的体系结构
在这里插入图片描述

类加载器
类加载的五个阶段:加载,验证,准备,解析,初始化
在这里插入图片描述
类加载机制:如果当java程序主动的使用一个未被加载到内存的类时,此时jvm就会对该类通过加载,连接,初始化三个步骤进行初始化,把这三个阶段统称为类加载阶段。虚拟机把描述类的数据从class文件加载到内存中,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是java类加载机制。

加载:
通过类的权限名获取此类的二进制字节流,将这个二进制字节流的静态存储结构转换成方法区的运行时数据结构,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证:
该阶段主要是为了保护Class字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
准备:
正式为类变量分配内存空间,并且设置变量的初始值
解析:
虚拟机将常量池中的符号引用转换为直接引用的过程(符号引用是一组符号来描述所引用的目标,符号可以是任何的字面形式的字面量,只要不会出现冲突能够定位到就行,而直接引用就是直接指向内存地址)
初始化:
在准备阶段,变量已经被赋过一次系统要求的初始值,而初始化阶段,则是要根据使用者的主观计划去赋值变量和其他资源

类加载的时机
(1)new一个新对象
(2)读,写静态变量
(3)调用静态方法
(4)父类的类加载:子类要初始化类加载,如果傅雷没有类加载,则要执行父类的类加载
(5)主函数的类:java类名启动入口类
加载做的事:1,把字节码加载到java进程的方法区(类型的信息,方法)2,在堆中生成一个class类对象,用来访问方法区各种数据的入口。

双亲委派机制
工作原理:如果一个类加载器收到了类加载器的请求,首先他不会自己去加载,而是先把这个请求发送给自己的父类加载器去完成,每一曾都是如此,知道一直向上委派到最顶端,如果父类加载器反馈自己无法完成这个类的加载,那么类加载器才会自己尝试加载这个类
在这里插入图片描述
优点:安全性(如果父类加载过一个类,而此时类加载器收到该类的加载请求,直接通过本级加载器便会重复加载,保证java代码的安全性)
使得java类和类加载器之间带有了优先级的层次关系
父类加载过的,子类就不用加载了
缺点:由于加载都要从下至上一次请求,不够灵活
沙箱安全机制
java的安全模型就是java沙箱,什么是沙箱?沙箱是限制程序运行的环境,沙箱机制就是将java代码限定在jvm虚拟机内运行。并且严格的限制代码对本地资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏,主要是限制系统资源访问。
所有的 Java 程序运行都可以指定沙箱:
增加了安全策略
增加了代码签名
引入域:系统域和应用域
运行时数据区域
线程私有区域:程序计数器,java虚拟机栈,本地方法栈
1,程序计数器:一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号记录
2,java虚拟机栈:描述的是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧用于储存局部变量表,操作数栈,动态链接,方法出口。生命周期与线程相同,线程启动,虚拟机栈就创建,出栈就自动销毁,(基础数据类型是传值,引用是传引用地址的值)
3,本地方法栈:与虚拟机栈的作用完全一样,区别:本地方法栈执行虚拟机栈使用的Native方法服务,而虚拟机栈为JVM执行的Java方法服务。
线程共享区域:java堆,方法区,运行时常量池
1,java堆:是JVM管理的最大内存区域,程序启动时就创建,所有对象的实例以及数组都要在堆上分配。
2,方法区:储存已被虚拟机加载的类信息,常量,静态变量,当方法区无法满足内存分配需求时,就会抛出OOM异常
3,运行时常量池:是方法区的一部分,文件中除了有类的版本,字段,方法,接口,还有一项信息是常量池表,用于存放编译期生成的各种字面量和符号引用,在jdk1.7之后,也在堆里
内存溢出与内存泄漏
内存溢出:
创建变量/对象/类加载,需要现在对应的内需区域分配一块内存空间,如果该区域内存不足,需要执行GC(垃圾回收),如果gc后,内存还不够,就会出现内存溢出(OOM)。整个进程挂掉
解决方法:
(1)优化代码(空间复杂度),复用变量等等
(2)java进程启动时,加大对应内存区域的空间
(3)如果系统内存不足满足第二个条件,还可以加大系统内存
内存泄漏:
内存中,随着进程运行时间越来越长,存放的无用数据(变量,值,对象,类型)越来越多,可用内存空间越来越少,可能的场景,用户登录时,创建一个session并保存,注销时,退出登录时,删除session,结果:进程一直运行,由用户一直使用系统,随着使用时间越长,最终出现oom
解决方法:
(1)程序代码上优化,如设置超时时间,定时清理长期不用的数据
(2)临时方案:有时候有些老旧的大型项目,不太好优化,隔一段时间重启一下(万能重启方法)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值