JVM概述
1.Java虚拟机所管理的内存包括以下几个运行时数据区域:
  ①.程序计数器
    程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一个要执行的字节码指令,分支、循环、跳转、异常处理都需要依赖于这个计数器来完成;
    Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来来实现,在任何一个时刻、一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器。
 
  ②.Java虚拟机栈(主要存储 8种基本数据类型 + 对象的引用 + 实例方法)
     Java虚拟机栈的局部变量表存放了编译期可预知的各种基本数据类型(八种);栈主管程序的运行,生命周期跟随线程的生命周期;
     在虚拟机中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,对抛出StacKOverFlowErroe异常;如果虚拟机栈在动态扩展时,如果无法申请到足够的内存,会抛出OOM异常
 
  ③.本地方法栈
    本地方法栈和虚拟机栈的作用相似,区别是:虚拟机栈是为虚拟机执行Java方法服务的,本地方法栈是为虚拟机使用到native方法服务
    
  ④.Java堆
    Java堆(Java heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程所共享的一块内存区域,该内存区域是用来存放所有的对象实例,所以对象实例都是在这里分配内存。
    Java堆是垃圾收集器管理的主要区域;如果在堆中没有完成内存实例的分配,并且堆也无法扩展时,会抛出OutOfMemory的异常
    Eden + survivor0 _ suvivor1 = 新生代
    新生代 + 老年代 = 堆
    逻辑上分为 新生区 + 养老区 + 元空间
    物理上分为 新生区 + 养老区
 
  ⑤.方法区(Non-Heap)(存储静态变量 + 常量 + 类信息(构造方法和接口定义) + 运行时常量池存在方法区中)
    方法区与Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
 
  ⑥.运行时常量池
  ⑦.直接内存
 
 类加载器
 
1.类加载器是干什么的?
 ClassLoader:根据一个指定的类的名称,找到或者生成对应的字节码,从这些字节码中定义出一个java类,java.lang.Class类的对象
 
2.类装载器ClassLoader有四种:
 Bootstrap loader 启动类加载器(负责加载java的核心类库,比如:rt.jar)
 扩展类加载器 ExtensionClassLoader(加载java的扩展库)
 应用程序类加载器,也叫系统类加载器 appClassLoader,负责加载当前classpath的所有类
 用户自定义加载器:java.lang.ClassLoader的子类
   
3.类的加载时机:
 创建类的实例 new一个对象的时候
 访问某个类或接口的静态变量,或者对该静态变量赋值
 调用类的静态方法
 反射 Class.forName()
 
4.双亲委派机制:
 类加载器是根据指定全类名将Class文件加载到JVM内存,转为Class对象
 双亲委派是指:如果一个类加载器收到类加载的请求,首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器完成;只有当父类加载器在自己的搜索范围找不到指定的类时,子类加载器才会尝试去加载
 
双亲委派机制的优点:
 这种机制的好处就是:如果有人想要替换系统级别的类,比如:String.java ;如果类加载器直接加载了,就有可能会运行被篡改过的String类,双亲委派机制,保证了永远是最顶端的类加载器加载String类;保护java核心库的安全性
 
针对java.*开头的类,JVM的实现中保证了必须由bootstrap来加载
在自定义的类加载器里面强制加载自定义的java.lang.String类,这样是不可行。在JVM中,判断一个对象是否是某个类型时,如果该对象的实际类型与待比较的类型的类加载器不同,那么会返回false。
 
双亲委派机制是自己不加载,先向上传递
代理模式正好和双亲委派机制相反,代理模式是自己先加载,如果无法加载,就向上传递,Tomcat是典型的代理机制

JVM概述和类加载器的更多相关文章

  1. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  2. JVM的艺术—类加载器篇(二)

    分享是价值的传递,喜欢就点个赞 引言 今天我们继续来深入的剖析类加载器的内容.上节课我们讲了类加载器的基本内容,没看过的小伙伴请加关注.今天我们继续. 什么是定义类加载器和初始化类加载器? 定义类加载 ...

  3. JVM的艺术—类加载器篇(三)

    JVM的艺术-类加载器篇(三) 引言 今天我们继续来深入的剖析类加载器的内容.上篇文章我们讲解了类加载器的双亲委托模型.全盘委托机制.以及类加载器双亲委托模型的优点.缺点等内容,没看过的小伙伴请加关注 ...

  4. Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2

    1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名 ...

  5. JVM学习--(六)类加载器原理

    我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...

  6. JVM启动过程 类加载器

    下图来自:http://blog.csdn.net/jiangwei0910410003/article/details/17733153 package com.test.jvm.common; i ...

  7. JVM学习记录-类加载器

    前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...

  8. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  9. JVM体系结构之二:类加载器之2:JVM 自定义的类加载器的实现和使用

    一.回顾一下jdk自带的类加载器: 1.java虚拟机自带的加载器     根类加载器(Bootstrap,c++实现)     扩展类加载器(Extension,java实现)     应用类加载器 ...

随机推荐

  1. js---电商中常见的放大镜效果

    js中的放大镜效果 在电商中,放大镜效果是很常见的,如下图所示: 当鼠标悬浮时,遮罩所在区域在右侧进行放大. 在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完 ...

  2. Python-基于向量机SVM的文本分类

    项目代码见 Github: 1.算法介绍 2.代码所用数据 详情参见http://qwone.com/~jason/20Newsgroups/ 文件结构 ├─doc_classification.py ...

  3. js深度克隆对象、数组

    function deepCopy(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { ...

  4. springboot 获取Resource目录下的文件

    如图,获取user.png: 代码实现: //文件路径,此处static前不能加/,否则解析不到try { //此处的static前不能加/!!! file = ResourceUtils.getFi ...

  5. MariaDB简单操作

    RHEL7之后操作系统带的数据库都是mariadb,跟mysql一样用 1.安装客户端和服务端 [root@localhost ~]# yum install mariadb mariadb-serv ...

  6. VS Code配置Go语言开发环境(建议使用goland)

    VS Code是微软开源的一款编辑器,插件系统十分的丰富.本文就介绍了如何使用VS Code搭建Go语言开发环境. VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论 ...

  7. IDEA 学习笔记之 Spark/SBT项目开发

    Spark/SBT项目开发: 下载Scala SDK 下载SBT 配置IDEA SBT:(如果不配置,就会重新下载SBT, 非常慢,因为以前我已经下过了,所以要配置为过去使用的SBT) 新建立SBT项 ...

  8. Docker4-docker私库的搭建及常用方法-docker-registry方式

    一.简单介绍 前面已经介绍,可以使用Docker Hub公共仓库,但是大多数情况企业都需要创建一个本地仓库供自己使用.这里介绍几种搭建私库的方法 私库的好处有几点 1.节约带宽 2.可以自己定制系统 ...

  9. 使用jsr303实现数据校验

    除了前端的js验证,服务端也可加入数据验证,springmvc中有两种方式可以验证输入 利用spring自带的验证框架 利用jsr303实现 jsr303实现数据校验 jsr303是java为bean ...

  10. python requests-toolbelt 生成上传multipart/form-data格式数据

    需求背景 想使用requests做一个自动上传的功能,发现这里问题挺多的,就记录一下. 如上图上传功能,一般分为input标签,非input标签.我这里也不管什么标签,直接抓包看数据流. Conten ...