jvm学习笔记(一)

jvm学习笔记(一)

1.全部笔记链接

JVM学习笔记(一)
JVM学习笔记(二)
JVM学习笔记(三)
JVM学习笔记(四)

(待更新…)

3.类加载器

作用

加载.Class文件

类别

  • 虚拟机自带的加载器
    • 启动类(根)加载器 rt.jar
    • 扩展类加载器 ExtClassLoader
    • 应用程序(系统类)加载器 AppClassLoader
  • 自定义加载器
    • User ClassLoader

加载步骤

使用双亲委派机制对类进行加载。

  1. 类加载器收到类加载请求
  2. 将请求向上委托给父类加载器去加载,一直向上委托,直到启动类(根)加载器
  3. 启动类(根)加载器检测是否能加载,能则进行类加载,否则通知子加载器进行加载
  4. 重复步骤3中的加载步骤(检测加载,或者向下通知),直至应用程序加载器无法加载并抛出异常

获得类加载器

实例----->getClass()----->Class模板----->getClassLoader()----->应用程序加载器----->getParent()----->扩展类加载器----->getParent()----->null(后面的加载器无法直接获取)

4.双亲委派机制

向上委托APP–>EXT–>BOOT(无User ClassLoader)

向下加载BOOT–>EXT–>APP

加载过程:

  1. 类加载器收到类加载请求
  2. 将请求向上委托给父类加载器去加载,一直向上委托,直到启动类(根)加载器
  3. 启动类(根)加载器检测是否能加载,能则进行类加载,否则通知子加载器进行加载
  4. 重复步骤3中的加载步骤(检测加载,或者向下通知),直至最后的加载器无法加载并抛出异常

在这里插入图片描述

5.沙箱安全机制

参考:

https://www.cnblogs.com/MyStringIsNotNull/p/8268351.html

https://developer.ibm.com/zh/articles/j-lo-javasecurity/

沙箱概念

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

JAVA沙箱的基本组件

  • 字节码校验器(bytecode verifier)
  • 类装载器(class loader)
  • 存取控制器(access controller)
  • 安全管理器(security manager)
  • 安全软件包(security package)

基本组件的作用

  • 字节码校验器(bytecode verifier):确保Java类文件遵循Java语言规范。但核心类不会进行检验(因为核心类不会出现语言规范错误)。

  • 类装载器(class loader):使用双亲委派机制进行类的加载, 从最内层JVM自带类加载器开始加载,外层恶意同名类得不到加载从而无法使用。(防止恶意覆盖或干涉java核心代码)

  • 存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定。

  • 安全管理器(security manager):是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器优先级高。

  • 安全软件包(security package):java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括:

    • 安全提供者
    • 消息摘要
    • 数字签名
    • 加密
    • 鉴别

6.JAVA安全模型

该模型为jdk 1.0下的安全模型,其他java安全模型,请到链接:https://developer.ibm.com/zh/articles/j-lo-javasecurity/

在这里插入图片描述

沙箱在JAVA安全模型中的应用

在 Java 中将执行程序分成本地和远程两种,本地代码默认视为可信任的,而远程代码则被看作是不受信的。对于授信的本地代码,可以访问一切本地资源。而对于非授信的远程代码在早期的 Java 实现中,安全依赖于沙箱 (Sandbox) 机制。沙箱机制就是将 Java 代码限定在虚拟机 (JVM) 特定的运行范围中,并且严格限制代码对本地系统的资源访问,通过这样的措施来保证对远程代码的有效隔离,防止对本地系统造成破坏。

该模型为jdk 1.2下的安全模型,其他更早的java安全模型,请到链接:https://developer.ibm.com/zh/articles/j-lo-javasecurity/

在这里插入图片描述

在 Java1.2 版本中,再次改进了安全机制,增加了代码签名。不论本地代码或是远程代码,都会按照用户的安全策略设定,由类加载器加载到虚拟机中权限不同的运行空间,来实现差异化的代码执行权限控制。

该模型为jdk 1.6下的安全模型,其他更早的java安全模型,请到链接:https://developer.ibm.com/zh/articles/j-lo-javasecurity/

在这里插入图片描述

域的概念

当前最新的安全机制实现,则引入了域 (Domain) 的概念。虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域 (Protected Domain),对应不一样的权限 (Permission)。存在于不同域中的类文件就具有了当前域的全部权限。

临时扩大访问权限

部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域 (Protected Domain),对应不一样的权限 (Permission)。存在于不同域中的类文件就具有了当前域的全部权限。

临时扩大访问权限

在应用开发中还有一些关于安全的复杂用法,其中最常用到的 API 就是 doPrivileged。doPrivileged 方法能够使一段受信任代码获得更大的权限,甚至比调用它的应用程序还要多,可做到临时访问更多的资源。有时候这是非常必要的,可以应付一些特殊的应用场景。例如,应用程序可能无法直接访问某些系统资源,但这样的应用程序必须得到这些资源才能够完成功能。针对这种情况,Java SDK 给域提供了 doPrivileged 方法,让程序突破当前域权限限制,临时扩大访问权限。

posted @   鸭梨的药丸哥  阅读(5)  评论(0编辑  收藏  举报  
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示