1.jvm位置
2.jvm的体系结构
3.类加载器:加载class文件
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)]
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