编程语言的层级关系

文章目录

  • 编程语言的层级关系
  • JVM内部结构
  • 类加载器
  • 执行引擎
  • Java栈 、本地方法栈J
  • PC寄存器
  • 方法区(元空间)
  • Java堆
  • 直接内存

电脑硬件–>windows系统(C/C++)–>JVM虚拟机(C/C++)–>Java代码

JDK是工具包 ,JDK中包含jre,jre 就是JVM 虚拟机

JVM内部结构

  • 绿色是功能区域(真正干活的),功能(类加载,垃圾回收,执行引擎) 类加载是入口 ,执行引擎是出口。
  • 橙色是线程共享区域,每个线程进来共享的区域(包括方法区、Java堆、直接内存(java1.4非阻塞NIO之后就没了)大小受电脑内存影响),类存放在方法区,相当于模板 共享,根据模板创建类的实例对象 ,存在栈中。)
  • 蓝色是线程私有区域,每个线程进来都会开辟一个栈,当线程执行完了 ,栈、本地方法栈、pc寄存器就会销毁。没法共有,直接销毁。
public class  Demo1(){   //Demo类属于模板 存在方法区,对象是类的实例public void demo1(String i){ //成员变量demo1是方法 存在栈中,形参i 是局部变量存在栈中Demo1 demo1 =  new Demo1();//Demo1为类  方法区//demo1 引用(指向 Java堆中对象的 引用地址) 栈中 //new Demo1() 类的实例 java堆中int i = 1 ;  //局部变量 栈中              }}

执行流程

类加载器

  • Bootstrap Class Loader C++写,JVM启动, 加载Java基础类,对应的文件是%JRE_HOME/lib/
    目录下的rt.jar、resources.jar、charsets.jar和class等
  • Extension Class Loader 继承URL ClassLoader 加载扩展类 对应的文件是 %JRE_HOME/lib/ext 目录下的jar和class等
  • App Class Loader 继承URL Class Loader ,系统类加载器
    对应的文件是应用程序classpath目录下的所有jar和class等
public class  Demo2(){  public  static void main(String[] args){System.out.println(HKSCS.class.getClassLoader());//bootstrap Class LoaderSystem.out.println(ZipInfo.class.getClassLoader());//Extension Class LoaderSystem.out.println(Demo2.class.getClassLoader());//App Class Loader}}

面试题:java双亲委派机制及作用 (类加载机制)

  • 什么是双亲委派机制
    当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类
  • 双亲委派机制的作用
    1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。防止把jdk中的类覆盖。
    2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

执行引擎

作用 : 执行编译后的字节码指令.
主要的执行技术有 : 解释执行,即时编译执行,自适应优化执行, 芯片级直接执行
(1)解释:属于第一代JVM;
(2)即时编译:JIT属于第二代JVM;
(3)自适应优化:(目前Sun的HotspotJVM采用这种技术)吸取第一代JVM和第二代JVM的经验,采用两者结合的方式。
开始对所有的代码都采取解释执行的方式,
并监视代码执行情况,然后对那些 经常 调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。
若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行;
(4)芯片级直接执行:内嵌在芯片上,用本地方法执行Java字节码。

Java栈 、本地方法栈J

两者合并为栈,主要存放动态链接、局部变量等信息,线程创建的时候,就创建栈

因为只有一个进口 和出口 ,栈中的方法是现进后出,

方法出口是指 每执行完一个方法之后要回到 调用此方法的前一个方法中,理解很抽象。

本地方法栈作用 : 用于本地方法调用, JDK源码中好多使用了Native关键字, 也就是调用底层C语言编写的方法.,这种方法是实现类的方法,但是没有方法体。合并之后存在栈中

栈中放置以下内容

栈中存放基本类型的原值和引用类型的地址值.
基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括:类类型,接口类型和数组,方法的实例

PC寄存器

作用 : 每个线程启动的时候,都会创建一个PC寄存器。保存下一条将要执行的指令地址. PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

以下为线程共享区

方法区(元空间)

jdk1.8之后 就改名为元空间 ,不再占JVM的内存(1/4内存条)了,直接占内存条(16G)的内存。所以1.8之后就不会溢出

作用 : Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。比如类的字段、方法名(方法的模板,不是真实的方法)、常量池等。
方法区的大小决定系统可以保存多少个类。如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。

Java堆

堆,栈,方法区之间的关系图:

堆的内部结构(垃圾回收 复制算法)

直接内存

作用 : 提高一些场景中的性能.
直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
本机直接内存的分配不会受到Java 堆大小的限制,受到本机总内存大小限制
配置虚拟机参数时,不要忽略直接内存 防止出现OutOfMemoryError异常
直接内存(堆外内存)与堆内存比较
直接内存申请空间耗费更高的性能,当频繁申请到一定量时尤为明显 直接内存IO读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显

未完待续……

深入java虚拟机-JVM (java virture mechine)相关推荐

  1. java virtual的作用_JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚

    存储交换根据传递信息单位的大小可分为() 请简要回答1951年<幼儿园暂行规程>和<幼儿园暂行教学纲要>所规定的幼儿园的教养原则. 下列哪种下载方式不需要服务器?() 技能考核 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

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

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

  5. 【深入Java虚拟机JVM 01】Java发展与展望概述

    目录 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 展望Java技术的未来 1.4.1 模块化 1.4.2 混合语言 1.4.3 多核并行 1.4.4 进一步丰富语法 1.4 ...

  6. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

  7. Java虚拟机(JVM)以及跨平台原理

    一. Java概述 1. Java语言概述 2. Java虚拟机以及跨平台原理 3. Java的主要就业方向 4. Java的不同版本 5. Java开发环境搭建 6. 第一个Java程序示例 7.  ...

  8. 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)

    一.什么是类加载机制? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的时机 类 ...

  9. Java虚拟机JVM简单理解

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  10. [java] 虚拟机(JVM)底层结构详解[转]

    [java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...

最新文章

  1. You are what you say!
  2. 学习构建WDF驱动程序 - 初步了解SOURCE和makefile文件
  3. Verdi-ug --- nschema Tutorial
  4. php使用redis做缓存,php使用redis做缓存和使用redis保存session
  5. 产品经理必懂技术术语(后台类)
  6. 局域网Ubuntu与WinXP实现文件共享
  7. rabbitmq可靠性投递_RabbitMQ 可靠投递
  8. android mac转数据格式转换,mac环境下Android 反编译
  9. python用户登录a_用Python实现用户登录接口
  10. 腾讯叮当智能屏发布,主打视听体验、海量内容、儿童模式
  11. tshark过滤并保存包特定字段
  12. 张鑫旭的《CSS世界》读后笔记
  13. Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选
  14. linux软硬链接 计数,深入理解Linux的软链接和硬链接
  15. coreldraw2022(CDR 2022)中文新增更新内容介绍win/mac
  16. MySQL高可用架构故障自动转移插件MHA
  17. Shell编程-正则表达式及正则表达式在线测试网站
  18. HDR视频色调映射算法(之四:Display adaptive TMO)
  19. 总结-互联网校招面试锦囊
  20. 计算机应用基础试题文件夹,计算机应用基础试题及参考答案

热门文章

  1. bash中文手册在线pdf
  2. 莫言:自尊就是吃饱了撑的
  3. 优化seo需要注重以下几点
  4. ChatGPT 一款超越想象的智能聊天机器人
  5. 计算机智能方面相关论文,计算机人工智能论文.doc
  6. 虚拟化的适用范围和适用场景,服务器虚拟化架构和功能
  7. Windows 启用 IIS
  8. React仿大众点评外卖app
  9. mesos java_Mesos实战 PDF 下载
  10. 欧美一些著名的高尔夫模拟器