JVM结构

摘自:https://www.cnblogs.com/xuningchuanblogs/

1、Java虚拟机

Java的虚拟机相当于我们的一个java类,而java虚拟机实例,相当我们new一个java类,不过java虚拟机不是通过new这个关键字而是通过java.exe或者javaw.exe来启动一个虚拟机实例。

2、Java虚拟机的生命周期

java虚拟机的生命周期,首先,当一个程序启动之前,它的class会被类装载器装入方法区(不好听,其实这个区我喜欢叫做Permanent区),执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧(每个方法都对应一个栈帧),然后开始跑main函数,main函数里的代码被执行引擎映射成本地操作系统里相应的实现,然后调用本地方法接口,本地方法运行的时候,操纵系统会为本地方法分配本地方法栈,用来储存一些临时变量,然后运行本地方法,调用操作系统APIi等等。

Java虚拟机的两种线程

一种叫叫守护线程,一种叫非守护线程,main函数就是个非守护线程,虚拟机的gc就是一个守护线程。java的虚拟机中,只要有任何非守护线程还没有结束,java虚拟机的实例都不会退出,所以即使main函数这个非守护线程退出,但是由于在main函数中启动的匿名线程也是非守护线程,它还没有结束,所以jvm没办法退出。

3、Java虚拟机的体系结构

在这里插入图片描述
由上图可以看出 JVM是由五大模块组成

内存结构每个组成模块的具体概念

摘自:https://blog.csdn.net/qq_40368860

•本地方法栈(线程私有):登记native方法,在Execution Engine执行时加载本地方法库

•程序计数器(线程私有):就是一个指针,指向方法区中的方法字节码( 用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。

•方法区(线程共享):类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中 ,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

•Java栈(线程私有):Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一致

JVM对该区域规范了两种异常:

  1. 线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverFlowError异常

  2. 若虚拟机栈可动态扩展,当无法申请到足够内存空间时将抛出OutOfMemoryError,通过jvm参数–Xss指定栈空间,空间大小决定函数调用的深度

•堆(线程共享):虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆

类加载子系统

在这里插入图片描述

4、JVM中的Class Loader(类加载)

摘自:https://www.cnblogs.com/QuixoteY/p/11150784.html

Class 文件是通过类加载器加载到JVM中的,JVM中默认有三种加载器:

  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它``。
    在这里插入图片描述
双亲委派机制

如果一个类有一个加载请求,那么他就会去把请求交给自己的委托父类,然后一级一级向上委托,依次向上(如上图),如果全部的父类加载器都没有那么会抛出一个ClassNotFound异常

沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox),什么是沙箱?
沙箱是一个限制程序运行的环境。沙箱机制就是将 Java 代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。
沙箱主要限制系统资源访问,那系统资源包括什么?
CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问的限制也可以不一样。

类加载的过程
  1. 加载,查找并加载类的二进制数据,在Java堆中也创建一个Java.lang.class类的对象
  2. 连接,连接包含了三块内容:验证、准备、初始化。
    (1)验证,文件格式,元数据,字节码,符号引用验证。
    (2)准备,为类的静态变量分配内存,并将其初始化为默认值。
    (3)解析,把类中的符号引用转换为直接引用。
  3. 初始化,为类的静态变量赋予正确的初始值。
类加载的生命周期:

加载(Loading)–>验证(Verification)–>准备(Preparation)–>解析(Resolution)–>初始化(Initialization)–>使用(Using)–>卸载(Unloading)
在这里插入图片描述

5.Native关键字

native是与C++联合开发的时候用的!java自己开发不用的!

使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的。

使用native的关键字的时候,它会调用底层C语言的库。会进入本地方法栈,调用本地方法接口JNI。
JNI作用:扩展java的使用,融合不同的编程语言为java所用。 最初:c、c++
它在内存区域中专门开辟了一块标记区域:native method stack,登记native方法
在最终执行的时候,通过JNI加载本地方法库中的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值