JVM探究(一)谈谈双亲委派机制和沙箱安全机制

JVM探究

  • 请你谈谈你对JVM的理解?java8虚拟机和之前的变化gengxin?

  • 什么是OOM,什么是栈溢出StackOverFlowError

  • JVM的常用调优参数有哪些?

  • 内存快转如何抓取,怎么分析Dump文件?知道吗?

  • 谈谈你对JVM中类加载器的认识?

1.JVM的位置

image

2.JVM的体系结构

image

  • 栈里面肯定不会有垃圾,用完就弹出来了。

  • 堆里面会有垃圾

  • JVM调优99%都是调方法区和堆

3.类的加载器

  • 作用:加载class文件~ new Student();

image

package com.qingkuang.reflection;



public class TestCar {

    public int age;

    public static void main(String[] args) {
        TestCar car1 = new TestCar();
        TestCar car2 = new TestCar();
        TestCar car3 = new TestCar();

        car1.age=1;
        car2.age=2;
        car3.age=3;


        System.out.println(car1.hashCode());
        System.out.println(car2.hashCode());
        System.out.println(car3.hashCode());

        Class<? extends TestCar> aClass1 = car1.getClass();
        Class<? extends TestCar> aClass2 = car2.getClass();
        Class<? extends TestCar> aClass3 = car3.getClass();

        System.out.println(aClass1.hashCode());
        System.out.println(aClass2.hashCode());
        System.out.println(aClass3.hashCode());
    }


}

image

​ (1).虚拟机自带的加载器

​ (2).启动类(根)加载器

​ (3.)扩展类加载器

​ (4.)应用程序加载器

​ (5)百度双亲委派机制

4.双亲委派机制

image

  • 双亲委派机制:安全

  • 1.APP--->EXC--->BOOT(最终执行)

  • BOOT没有-->EXC没有-->APP

image

修改文件路径

image

  1. 类加载器收到类加载请求 Application
  2. 讲个这请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器。
  3. 启动加载器检查是否能够加载当前这个类,能加在就结束,使用当前的加载器,否则,抛出异常,通知自家在其进行加载
  4. 重复步骤3
  5. Class Not Found

​ null:java调用不到~c、c++

​ Java = C++--;去掉繁琐的东西,指针,内存管理

5.沙箱安全机制

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

​ 所有的Java程序运行都可以指定沙箱,可以定制安全策略

​ 在java中将执行程序分成本地代码和远程代码两种,本地代码默认为可信任的,而远程代码则是被看作是不受信任的。堆与手心的本地代码,可以访问一切本地资源。而非堆非授信的远程代码在早期的Java实现中,安全依赖于沙箱(sandbox)机制。如下图所示的JDK1.0安全模型。

image

​ 但如此严格的安全机制也给程序的功能扩展带来障碍,比如当用户希望远程代码访问本地系统文件的时候,就无法实现,因此在后续的Java1.1版本中,针对安全机制做了改进,增加了安全策略,允许用户指定的代码对本地资源的访问权限。如下图所示JDK1.1安全模型。

image

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

image

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

image

组成沙箱的基本组件:

  • 字节码校验器(bytecode verifier):确保Java类文件遵循Java语言规范。这样可以帮助Java程序实现内存保护。但并不是所有的类文件都会经过字节校验,比如核心类。
  • 类装载器(class loader):其中类装载器在3个方面对Java沙箱起作用
    • 它防止恶意代码去干涉善意的代码;//双亲委派机制
    • 他守护了被信任的类库边界;
    • 他守护了被信任的类库边界;
    • 他将代码归入保护域,确定了代码可以进行那些操作。

​ 虚拟机为不同的类加载器载入的类提供了不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,他们相互之间甚至不可见。

​ 类加载器采用的机制是双亲委派机制

  1. 从最内层JVM自带类加载器开始加载,外层而已同名类的不到加载congress无法使用;
  2. 由于严格通过包来区分了访问域,外层而已的类通过内置代码也无法获得权限到内层类,破坏代码就自然无法生效。
  • 存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,二这个控制的策略设定,可以由用户指定。
  • 安全管理器(security manager):是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器优先级高
  • 安全软件包(security package):java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括
    • 安全提供者
    • 消息摘要
    • 数字签名 keytools https
    • 加密
    • 鉴别
posted @ 2022-01-14 16:47  轻狂书生han  阅读(87)  评论(0编辑  收藏  举报