JVM探究

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

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

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

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

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

1.JVM的位置

2.JVM的体系结构

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

  • 堆里面会有垃圾

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

3.类的加载器

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

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());
} }

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

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

​ (3.)扩展类加载器

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

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

4.双亲委派机制

  • 双亲委派机制:安全

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

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

修改文件路径

  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安全模型。

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

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

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

组成沙箱的基本组件:

  • 字节码校验器(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
    • 加密
    • 鉴别

JVM探究(一)谈谈双亲委派机制和沙箱安全机制的更多相关文章

  1. 深入探究JVM之类加载与双亲委派机制

    @ 目录 前言 类的生命周期 加载 验证 准备 解析 初始化 案例一 案例二 案例三 案例四 类加载器 类加载器和双亲委派模型 破坏双亲委派模型 第一次 SPI Tomcat OSGI 总结 前言 前 ...

  2. JVM学习六:JVM之类加载器之双亲委派机制

    前面我们知道类加载有系统自带的3种加载器,也有自定义的加载器,那么这些加载器之间的关系是什么,已经在加载类的时候,谁去加载呢?这节,我们将进行讲解. 一.双亲委派机制 JVM的ClassLoader采 ...

  3. jvm类加载器以及双亲委派

    首先来了解几个概念: 类加载: 概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验--转换解析--初始化,最终形成能被java虚拟机直接使用的java类型,就是jvm的类加载机制. ...

  4. 实例分析JVM安全体系:双亲委派、命名空间、保护域、策略

    在了解双亲委派模型之前,先了解一下类加载器的概念: 类加载器的作用就是将真实的class文件根据位置将该Java类的字节码装入内存,并生成对应的Class对象.用户可以通过继承ClassLoader和 ...

  5. 【JVM】浅谈双亲委派和破坏双亲委派

    一.前言 笔者曾经阅读过周志明的<深入理解Java虚拟机>这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解,正应 ...

  6. JVM类加载过程与双亲委派模型

    类加载过程 类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终形成被JVM直接使用的Java类型.包含: 加载:获取该类的二进制字节流,将字节流代表的静态存储 ...

  7. [jvm] -- 类加载器及双亲委派模板篇

    类加载器 JVM 中内置了三个重要的 ClassLoader BootstrapClassLoader(启动类加载器):最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的j ...

  8. JVM——类加载器的双亲委派模型

    类加载器双亲委派模型,如下图所示: 双亲委派模型的工作过程 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此 ...

  9. jvm类加载器和双亲委派模型

    类加载器按照层次,从顶层到底层,分为以下三种:  (1)启动类加载器(Bootstrap ClassLoader)   这个类加载器负责将存放在JAVA_HOME/lib下的,或者被-Xbootcla ...

随机推荐

  1. 利用 trap 在 docker 容器优雅关闭前执行环境清理

    当一个运行中的容器被终止时,如何能够执行一些预定义的操作,比如在容器彻底退出之前清理环境.这是一种类似于 pre stop 的钩子体验.但 docker 本身无法提供这种能力,本文结合 Linux 内 ...

  2. [C# Expression] 之动态创建表达式

    上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章.   在一些管理后台中,对数据进行 ...

  3. UDP&串口调试助手用法(1)

    一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...

  4. Visual Studio Code常用快捷键

    说明 以下快捷键适用于windows环境下, Mac请将ctrl替换为command按键: 部分快捷键或不一样. 查看VSCode快捷键定义: settings -> keymaps. 目前使用 ...

  5. cmake之指定clang(++)编译器为默认编译器

    1.说明 本文演示环境的cmake版本3.18 clang是自己源码安装的,非获取已经编译好的binary 2.代码 2.1 添加下面的代码到CMakeLists.txt中,且放到 project语句 ...

  6. The Longest Straight(FZUoj2216)

     Problem 2216 The Longest Straight Accept: 82    Submit: 203Time Limit: 1000 mSec    Memory Limit : ...

  7. ROC and AUC

    目录 概 TPR, FPR ROC and AUC 代码 ROC-wiki 概 AUC常常在文章中作为评价一个分类器优劣的指标, 却总是忘记其原由, 索性记上一笔. TPR, FPR 首先理解TP, ...

  8. Blazor组件的new使用方式与动态弹窗

    1. 前言 在Blazor中的无状态组件文中,我提到了无状态组件中,有人提到这个没有diff,在渲染复杂model时,性能可能会更差.确实,这一点确实是会存在的.以上文的方式来实现无状态组件,确实只要 ...

  9. docker容器跨主机网络overlay

    前提:已部署好docker服务服务预计部署情况如下10.0.0.134 Consul服务10.0.0.135 host1  主机名mcw510.0.0.134 host2  主机名mcw6host1与 ...

  10. Java EE数据持久化框架 • 【第4章 MyBatis动态SQL】

    全部章节   >>>> 本章目录 4.1 MyBatis动态标签 4.1.1  MyBatis动态标签介绍 4.1.2 < if >标签 4.1.3 update语 ...