jvm脉络梳理1- jvm基础

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 jvm脉络梳理1- jvm基础,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1.jvm位置

请添加图片描述

2.jvm的体系结构

在这里插入图片描述

3.类加载器:加载class文件

在这里插入图片描述

  • new ClassName() –有类实例化对象,对象引用在栈中,类在堆中
    在这里插入图片描述
  • 虚拟机自带的加载器
  • 启动类(根)加载器
  • 扩展类加载器
  • 应用程序加载器
Demo05 demo05 = new Demo05();
Class aClass = demo05.getClass();

ClassLoader classLoader = aClass.getClassLoader();
System.out.println(classLoader);  //appClassLoader lang\ClassLoader抽象类需要实现 
System.out.println(classLoader.getParent());//extClassLoaderJDK8_64\jre\lib\ext
System.out.println(classLoader.getParent().getParent());//null 1.没有2.java程序获取不到如:c写的  JDK8_64\jre\lib\rt.jar
sun.misc.Launcher$AppClassLoader@14dad5dc
sun.misc.Launcher$ExtClassLoader@1b6d3586
null

4.双亲委派机制

  • (检查自定义类(重名)是否在高级的类加载器中以存在)多重检查保证安全性
    • 从右到左检查类是否加载
    • Bootstap ClassLoader->Extension ClassLoader->System/App ClassLoader->自定义类加载器
    • 从左到右尝试加载类(根加载器中有,就不到下级加载器中查找了加载了、所以可以在扩展类加载器中加一些拦截机制,根加载器不要修改,否则java报错),保证基本object类的安全不让重复写类,写了也不起作用除非改动rt.jar中的类
  • 需要加载类时,自底向上查找缓存是否已经加载过,若没有,则自顶向下尝试加载
    在这里插入图片描述
  • 程序加载是形成一颗树,树根和枝干
    在这里插入图片描述
  • lombok三方插件在执行引擎这块,加入钩子函数动态生成get/set方法;
  • 运行时方法区无法加载钩子函数,类加载器加载少量,否则java代码就可以完成,所以大部分框架是在执行引擎这块加载三方插件
4.1 步骤
  • 类加载器收到类加载的请求
  • 将这个请求向上委托给父类加载器完成,一直向上委托,直到启动类加载器
  • 启动类加载器检查是否加载当前这个类,能加载就结束,使用当前加载器,否则抛出异常,通知子加载器进行加载
  • 重复步骤3
  • Class Not Found
  • null :java 调用不到,是由C++写的
  • java=C++去掉指针,内存管理(由jvm的GC管理)
  • java源码中native是jvm调用本地方法(操作系统)接口,调用C++ 写的方法

5.沙箱安全机制

  • Java安全模型的核心就是Java沙箱(sandbox),沙箱是一个限制程序运行的环境。沙箱机制是将java代码限定在虚拟机(JVM)特定的运行环境中,严格限制代码对本地系统资源访问,保证代码的有效隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,如:CPU、内存,文件系统,网络。不同级别的沙箱对这些资源访问的限制也不一样。
  • 所有的java程序运行都可以指定沙箱,定制安全策略
  • java中将执行程序分为本地代码和远程代码,本地代码默认为可信任的,远程代码不受信任的。授信代码可访问所有本地资源,非授信远程代码在早期java实现中,安全依赖于沙箱机制。
    在这里插入图片描述
  • 但严格的安全机制给程序功能扩展带来障碍,用户希望远程代码访问本地系统时就无法实现、在后续java1.1版本中,对安全机制做了改进,增加了安全策略,允许用户指定代码对本地资源的访问权限。
    在这里插入图片描述
  • java1.2版本中改进了安全机制(tomcat项目是用http),增加了代码签名(java签名https),不论本地远程代码都会按照用户的安全策略设定,有类加载器加载到JVM中权限不同的运行空间,实现差异化的代码执行权限控制。
    在这里插入图片描述
  • java1.6最新安全机制实现,引入域Domain的概念。虚拟机把所有代码加载到不同的系统域和应用域,系统域部分负责与关键资源进行交互,应用域部分通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同受保护域(protected Domin)对应不一样的权限(permission)。存在于不同域的类文件就具有了当前域的全部权限。电脑账户,不同权限不同。linux账号~jvm溢出之前java不让写,后面可写但溢出时程序停止。
    在这里插入图片描述
5.1 组成沙箱基本条件
  • 字节码校验器(bytecode berifier):确保java类文件遵循java语言规范。可以帮助java程序实现内存保护。但不是所有的类文件都会经过字节码校验,如核心类。java/javax开头的文件

  • 类装载器(class loader):其中类装载器下3个方面对沙箱起作用

    • 防止恶意代码干涉正常代码:双亲委派机制,改java代码不会生效。
    • 守护被信任的类库边界:双亲委派机制
    • 将代码归入保护域,确定代码可以进行那些操作
  • jvm为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成,每个被装载的类有一个名字,这个命名空间是有java虚拟机为每个类装载器维护的,互相看不见。

  • 类加载器采用的机制为双亲委派机制

    • 从最内层jvm自带类类加载器开始加载,外层恶意同名类得不到加载二无法使用
    • 由于严格通过包区分访问域,外层恶意类通过内置代码也无法得到权限访问到内层类,破坏代码自然无法实现-
  • 存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,这个控制策略设定有用户指定。

Robot robot = new Robot();  //机器人类控制电脑行为,外挂
  • 安全管理器(security controller)::是核心API和操作系统之间的的主要接口。实现权限控制,比存取控制器权限高。
  • 安全软件包(security package):java security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性:
    • 安全提供者
    • 消息摘要
    • 数字签名keytools https
    • 加密
    • 鉴别

6.Native本地方法接口

在这里插入图片描述

  • native:带native关键字的,说明java的作用范围达不到了,回去调用底层C语言的库
  • 会进入本地方法栈
  • 调用本地方法接口jni
  • jni 作用扩展java类的使用。融合不同的编程语言为java使用。调用类库python最初C/C++
  • java诞生的时候C/C++流行,要兼容C/C++
  • 在内存区域中开辟了一块标记区域:本地方法栈登记native方法
  • 最终执行的时候加载本地方法库中的方法通过JNI,除非操作硬件方面的或操作c++
  • Java程序驱动打印机/管理系统、robot,企业级应用中少见
  • 调用其他接口http请求python接口、restful、rpc/socket/webservice
  • PHP页面-NodeJs—socket-C++后台
private static native void registerNatives();
public static native long currentTimeMillis(); //System

7.PC寄存器:模拟计算机

  • 程序计数器:program counter register

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

8.方法区

  • Method Area方法区,被所有线程共享,所有字段和方法字节码,以及一些特殊方法,构造函数,接口代码也在此定义,即所有定义的方法信息都保存在改区域,此区域为共享区间。特殊的堆,是jvm的一种设计概念
  • 静态变量、常量、类信息(构造函数、接口定义)、运行时的常量池存在在方法区中,但是实例变量存在堆内存中,和方法区无关
  • static 、final、Class、常量池
    在这里插入图片描述

9.栈:数据结构。栈、队列。线程级别

  • 栈、队列(消息队列FIFO:先进先出–Mybatis默认规则)

  • 程序 = 数据结构 + 算法;非(框架+业务逻辑)

  • 栈内存:主管程序运行,生命周期和线程同步;线程结束栈内存释放,栈内存释放,程序结束。栈不存在垃圾回收问题。

  • 栈:8大基本类型,对象引用,实例方法(压方法栈溢出错误)

  • 栈运行原理:栈帧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuDPCCuX-1651397753809)(E:\zkNote\typora-user-images\image-20220419000058390.png)]
在这里插入图片描述

  • java引用值传递
  • 堆+栈+方法区交互关系
    在这里插入图片描述

10.三种JVM:我们用的是HotSpot 通过java -version了解

  • 三种虚拟机:SUN公司 hotspot ,无法裁剪到CLDC级别,只能扩展到CDC级别
  • BEA:Oracle JRockit,一个全面的Java运行时解决方案组合,基本JRockit JVM是世界上最快的JVM
  • J9VM JIT编译器,是JAVA运行时环境的一部分,作用是在JAVA应用运行时,将字节码(bytecode)编译成本地机器码(native machine code),使JVM在运行时(一次编译多次调用)省略识别字节码的步骤,从而提高jvm的性能.高度模块化,可以部署在桌面或服务器上,也可以部署在嵌入式环境中。入:CLDC级别环境。用同一个J9核心VM,搭配上适用具体环境的GC和JIT编译器

下一篇:jvm探究-01-jvm脉络梳理2-堆,内存调优

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123972.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!