zoukankan      html  css  js  c++  java
  • 学习JVM(一)

    学习JVM(一)

    [TOC]

    jvm的种类

    1. HotSpot VM (我们一直用的就是这种 sun公司的) 说的jvm调优 基本都是针对这个虚拟机的

    2. J9 VM

    J9是IBM开发的一个高度模块化的JVM。在许多平台上,IBM J9 VM都只能跟IBM产品一起使用。这不是技术限制,而是许可证限制。

    1. Jrockit

      其实 我也不了解 这些 只是粗略的看了一下,想知道详细的看这篇博客 也可以在网上搜搜其他的资料 ,不 你就是懒

      https://my.oschina.net/mengzhang6/blog/1618746?utm_medium=referral

      月 只是粗略的看了一下,想知道详细的 只是粗略的看了一下,想知道详细的 只是粗略的看了一下,想知道详细的 只是粗略的看了一下,想知道详细的 只是粗略的看了一下,想知道详细的 只是粗略的看了一下,想知道详细的

    jvm的位置 体系结构

    jvm的位置

    image-20210105154707560

    JVM的内存体系结构

    (垃圾一般只会出现在堆中 所谓的垃圾回收 调优 一般也都是针对堆的)

    image-20210105154744202

    类加载器

    有三种类加载器

    加载器是干嘛的

    就是加载class文件的 吧

    把class文件 加载到jvm内存中

    先加载class文件 然后把这个文件 加载 初始化成一个 类 class 如 car class (或字节码文件)

    xxxx.getclass 获取类模板文件

    xxxClass.getClassload 获取类加载器

    xxxClassload.getParent 获取该类加载器的 父加载器

    这三种加载器在那

    根类加载器

    rt jar包的的东西

    扩展类加载器

    jvm 目录下 etc文件夹里面的的一些jar包

    应用(系统)类加载器

    我们自己写的一些类 就相当于是应用加载器

    双亲委派机制

    目的就是下面说的这句话

    个人感觉是为了保证安全的不让你随便改jar包中的东西

    规则 加载类是这样的 先从应用加载器找自己的上层扩展加载器 再找根加载器

    然后从根加载器上开始执行这个类(或类中的一些方法) 根加载器上没有 就会报一个错 然后让下层(扩展类加载器)去执行

    扩展加载器也以此类推

    如果在应用加载器也没有找到那个方法 就是会报 class not found 没有找到那个方法

    目的是 为了防止随便改jar包中的东西jvm玩坏

    (假设这样一个场景) 怎么做到防止乱改的? 这种增强式或怎么样的修改 有什么用呢? 那个例子 只是为了说明 扩展和根加载器中有的 你再写一个 你的不会生效的 还是会执行父类的

    如自己写了一个和string 同包同类的类 然后在里面写一些其他的东西(当成是想扩展这个类里面的功能) 想运行 是不能运行的 jvm 不会走你的这个方法 还是会走原来的rt包下的string方法 你改了原来系统里面有的东西 是不会生效的 防止瞎改出问题 导致全崩了

    这个就是双亲委派机制 (一个类 会先去找父类的 如果父类中有 就走父类的 父类没有的才走你的 就是为了不让你随便乱改)

    但是如果你直接把jar包中的文件改了 如string类 然后再放到那个jar包中去 替换原来的string类 那那个jar包就被更改了 如果你改的有问题 整个java环境就崩了

      public void t(){
      Student student = new Student();
        Class<? extends Student> aClass = student.getClass();
        System.out.println(aClass);
        System.out.println(aClass.getClassLoader());
        // 其实不懂 为什么 这里获取 扩展类加载器都有 但是根加载器却没有了呢? 因为java底层调用的是c里面的方法 本地native方法
        // 调用的是c的方法 所以获取不到
    
        System.out.println(aClass.getClassLoader().getParent());
        System.out.println(aClass.getClassLoader().getParent().getParent()); // 这个获取的就是根加载器了
    
    
      }
    

    双亲委派机制的规则

    image-20210105154851225

    沙箱机制

    native方法

    在运行时数据区里面 有一个本地方法栈 它会去调本地方法接口(JNI) 然后本地方法接口 可以调本地方法库里面的一些方法

    目的是为了扩展 java 让java能调用c c++ python 等编码语言 让java可以做更多的事情 功能更强大

    代码中的注释 理解 native是什么

    image-20210104205527817

    pc 寄存器

    image-20210105154936603

    方法区

    (记黄色字的 知道里面放了些什么 就可以了 )

    (static final类的一些信息(class)常量池 构造方法接口)

    image-20210105155021403

    心之所向,素履以往

  • 相关阅读:
    BZOJ 1800 [Ahoi2009]fly 飞行棋
    BZOJ 3309 DZY Loves Math
    CAS Server和client 实现单点登录
    单点登录原理与简单实现
    Maven插件
    win10安装最新nexus-3.x及maven简单配置介绍
    oracle获取表的属性,包括字段,注释
    java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
    深入理解Tomcat虚拟目录
    环境搭建系列-系统安装之centos 6.5安装与配置
  • 原文地址:https://www.cnblogs.com/cnng/p/14232367.html
Copyright © 2011-2022 走看看