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. vmware配置静态ip

    wmware安装后,默认是动态ip地址. 在测试环境搭建虚拟机后,都需要使用静态ip地址.但是配置固定静态ip地址后,虚拟机总是不能上网和访问网站域名. 原来问题出在配置固定ip后配置的的网关和域名解 ...

  2. Django序列化&django REST framework

    第一章.Django序列化操作 1.django的view实现商品列表页(基于View类) # 通过json来序列化,但手写字典key代码量较大,容易出错:还有遇到时间,图片序列化会报错 from g ...

  3. 大家久等了,改造版阿里巴巴 sentinel 控制台终于开源了

    前言 最近几天,好几个小伙伴在后台询问,改造后的 sentinel-dashboard 什么时候开源.讲真,不是不想给大家放出来,是因为一些地方还没有完善好,怕误导了大家,在经过了一个星期业余时间的努 ...

  4. Python 对cookies的处理——urllib2

    import urllib2 import cookielib cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2 ...

  5. Thinkphp5.0第二篇

    查询构造器 //插入记录 $result=Db::table('think_data')->insert(['name'=>'张三','status'=>1]); //修改数据 $r ...

  6. MongoDB 学习笔记之 索引

    索引: db.media.createIndex({"Tracklist": 1}) 1表示升序 -1表示降序 我们要着重看一下对数组创建索引的情况. 构建一个集合:db.medi ...

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

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

  8. Angular.js 入门(一)

    最近在学习angular.js,为此方便加深对angular.js前端框架的理解,因此写下这篇angular.js入门 首先介绍下什么是angular.js? AngularJS 是一个 JavaSc ...

  9. SecureCRT连接虚拟机下的CentOS7

    1.首先在VMWare下配置CentOS为桥接模式: 2.查看本机ip: 3.ip addr查看centos的mac地址: 4.在root权限下修改/etc/sysconfig/network-scr ...

  10. 项目开发---使用node.js中sass语法

    前言:本文中所有sass文件都指后缀名为scss的文件.在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错. 一.sass插件的安装: gulp-sass-china //  ...