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. ORM组件LogORM使用指北

    LogORM是一个对数据库进行对象关系映射的ORM组件.当对数据库进行增删改操作时,组件会自动进行日志记录. 该组件支持.Net平台和.NetCore平台,支持SQL Server.Oracle.My ...

  2. Spring MVC-从零开始-文件上传(未完待续)

    Spring MVC-从零开始-文件上传(未完待续)

  3. Nginx 配置项优化详解

    (1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...

  4. linux常用开发命令总结

    linux常用命令 文件操作命令 1. cd 目录名/目录名  切换目录 cd .. 切换到上一级目录  (change dictionary) Ctrl+C强制退出命令行,回到上一级 2.ls    ...

  5. S2-052 漏洞复现

    Structs2框架已知的漏洞编号如下: S2-005 S2-009 S2-016 (含S2-013) S2-019 S2-020 S2-021 S2-032 S2-037(含S2-033) DevM ...

  6. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  7. .NET进阶篇-语言章-2-Delegate委托、Event事件

    知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和La ...

  8. 浅析十大常见排序(含C++代码)

    首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料: 1.<data structure and algor ...

  9. UVa12105 越大越好

    题文:https://vjudge.net/problem/12364(或者见紫书) 题解: 因为题目中有两个限制条件,那么我们就顺着题目的意思来dp,设dp[i][j]表示目前还剩下的i个火柴,用这 ...

  10. .net core运用application/x-www-form-urlencoded发起post请求

    通常情况下都是使用 application/json发起post请求,但是有的.net 接口只接收 application/x-www-form-urlencoded 例如: { name:" ...