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. 浅谈JavaScript的闭包原理

    在一般的教程里,都谈到子作用域可以访问到父级作用域,进而访问到父级作用域中的变量,具体是如何实现的,就不得不提及到函数堆栈和执行上下文. 举个例子,一个简单的闭包:   首先,我们可以知道,examp ...

  2. Android蓝牙低功耗(BLE)模块设计

    在阅读这篇文章之前你应该对GATT和Android蓝牙框架有一定的了解.这里不会向你解释Service.Characteristics等蓝牙知识.这里只是我写下我对Android Ble的再次封装来适 ...

  3. Redis 搭建一主二从三哨兵高可用集群

    1.单个redis服务搭建请参考:redis服务搭建 2.在/usr/local下创建目录redis-cluster,并在redis-cluster下创建 6379.6380.6381目录以及data ...

  4. 【SQL server初级】SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

    在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅) ...

  5. 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法

      很多新手在购买的虚拟主机后就开始尝试安装,却发现连接数据库老是出错,不知道什么问题,反复检查了自己填写的数据库连接信息发现也没有问题,这个时候我们似乎就没法了. 但这个其实是后台空间的设置问题,你 ...

  6. 详解http报文(2)-web容器是如何解析http报文的

    摘要 在详解http报文一文中,详细介绍了http报文的文本结构.那么作为服务端,web容器是如何解析http报文的呢?本文以jetty和undertow容器为例,来解析web容器是如何处理http报 ...

  7. php导出excel乱码怎么处理

    使用PHP导出excel文档,有时候莫名其妙就会出现导出的数据乱码,现在推荐一个万能修补大法 话不多说,直接上代码 核心就是在处理完数据之后,输出excel文件之前 添加 ob_end_clean() ...

  8. Android_基于监听的事件处理机制

    一.引言 在经过几天的学习之后, 首先熟悉了几大基本布局以及一些常用控件的使用方法,目前正在学习如何实现一个基本的登录注册界面及其功能,而实现功能就需要我们采用事件处理机制来进行调用事件处理方法.以下 ...

  9. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  10. android 6.0导航栏 NavigationBar影响视图解决办法

    在开发app的时候会遇到有些测试手机没有物理按钮,比如最近在做的一个app在小米手机上运行显示效果很好,但是在华为P7手机上显示就乱了,底部的NavigationBar直接覆盖在主视图上,导致按钮无法 ...