1.编译顺序:
                 编译器                     虚拟机      虚拟机         
java源文件*.java------->字节码*.class------>类装载器--->执行引擎

一个.class文件只能包含一个类或接口。因此.java文件中定义了多少类,编译时就会生成多少.class文件(内部类不算)。

2.java程序可以选择两种方式访问底层系统,由程序员选择:
(1).通过java程序调用javaapi调用本地方法,访问底层系统,与平台无关。
(2).通过java程序直接调用本地方法,访问底层系统与平台相关。
本地方法即操作系统提供的方法。

3.类装载器:
装载java编译器编译好的字节码*.class和java api的字节码到方法区。

java有两种类装载器:
(1).启动类装载器:系统唯一,属于虚拟机的一部分,用特定语言编写(与虚拟机体层语言相通)使用默认方式装载类,主要用来装载核心类库


(2).用户自定义类装载器:可有任意多个,用java编写,属于java应用程序的一部分,能被编译成字节码,并被虚拟机所装载。

一个装载器装载一个类及其该类所调用的一切类,使他们相互联系,并形成一个命名空间(name space),每一个类装载器对应一个命名空间。

即java中名字空间的原理。

类装载器成线形排列,自底向上,顶部为启动类装载器。除启动类装载器外,其他类装载器都由用户实例化,用来装载不同的类。当要装载一

个类时,底部的装载器试图将该类交给父装载器装载,而该父类又试图交给他的父类装载,一直向上,直到启动类装载器。若父类装载器无法

装载,则交给子类装载器装载,子类装载能装载的部分,将余下部分交给他的子类,直到底部。如:
装载器a,b,c,d,e,f,启动
a--->b--->c--->d--->e--->f--->启动
当有一个类fun需要被装载时,他会一直上溯到顶部即启动类装载器。如果启动类装载器无法装载fun则交给f装载,f装载能装载的部分,将其

余部分交给e,然后一直这样下去。

如上所述,运行过程中每个类装载器装载的类形成一个运行时包,同一运行时包里的类可以互相访问,但不能访问包外部的类。

4.虚拟机的生命周期:
每个java程序都有自己的虚拟机实例,随着程序的产生和消亡而产生与消亡。

5.java程序运行时的内存结构:
程序空间分为方法区,堆,java栈,本地方法栈。

(1)方法区存放装载的类数据信息包括:
基本信息:
每个类的全限定名。
每个类的直接超类的全限定名(可约束类型转换)。
该类是类还是接口。
该类型的访问修饰符。
直接超接口的全限定名的有序列表。

每个已装载类的详细信息:
运行时常量池:存放该类型所用的一切常量(直接常量和对其他类型,字段,方法的符号引用),它们以数组形式通过索引被访问,是外部调用

与类联系及类型对象化的桥梁。它是类文件(字节码)常量池的运行时表示。(还有一种静态常量池,在字节码文件中)。
字段信息:类中声明的每一个字段的信息(名,类型,修饰符)。
方法信息:类中声明的每一个方法的信息(名,放回类型,参数类型,修饰符,方法的字节码和异常表)。
静态变量
到类classloader的引用:即到该类的类装载器的引用。
到类class的引用:虚拟机为每一个被装载的类型创建一个class实例,用来代表这个被装载的类。

(2)堆存放所有生成的对象及对象的实例变量。

(3)java栈以帧的形似存放本地方法的调用状态(包括方法调用的参数,局部变量,中间结果等)。每调用一个方法就将对应该方法的方法帧压入

java栈,成为当前方法帧。当调用结束(返回)时,就弹出该帧。编译器将原代码编译成字节码(.class)时,就已经将各种类型的方法的局部变

量,操作数栈大小确定并放在字节码中,随着类一并装载入方法区。当调用方法时,通过访问方法区中的类的信息,得到局部变量以及操作数

栈的大小。

java栈帧(即方法帧)由局部变量区,操作数栈,帧数据区组成。

局部变量区为一个以字为单位的数组,每个数组元素对应一个局部变量的值。调用方法时,将方法的局部变量组成一个数组,通过索引来访问

。若为非静态方法,则加入一个隐含的引用参数this,该参数指向调用这个方法的对象。而静态方法则没有this参数。因此,对象无法调用静态

方法。

操作数栈也是一个数组,但却是通过栈操作来访问。所谓操作数是那些被指令操作的数据。当需要对参数操作时如a=b+c,就将即将被操作的参

数压栈,如将b和c压栈,然后由操作指令将他们弹出,并执行操作,此处由iadd指令将b和c弹出并相加,然后压入操作数栈(一系列均由iadd执

行)然后由i_storex指令将结果弹出,存到索引x指向的局部变量区数组内(此处索引x指向局部变量a)。
虚拟机将操作数栈作为工作区。

帧数据区处理常量池解析,异常处理等。

(4)本地方法栈:与调用的本地方法的语言相关,如调用的是一个c语言方法则为一个c栈。本地方法可以回调java方法。
若有java方法调用本地方法,虚拟机就运行这个本地方法。在虚拟机看来运行这个本地方法就是执行这个java方法,如果本地方法抛出异常,

虚拟机就认为是这个java方法抛出异常。

(5)执行程序时,通过对象的引用在方法区中查找装载的类,若还没有装载,则查找字节码(类名.class),并将其装载入方法区。
在执行过程中,虚拟机会将对象的符号引用(即对象名)替换为直接的指针,以提高访问速度。

(6)因此,大体可以表述为:
方法区:存储类包括接口的各种信息,字节码装载到此处。
java栈:存储被调用的方法的各种信息,只有调用该方法时,才会将该方法帧压入java栈。
堆:存储对象的信息,包括对象的实例变量,但不包括对象的方法。只有调用对象的方法时,才将方法帧压入java栈中。

6.java数据类型:
数值类型:
浮点类型:float double
整数类型:byte,short,int,long,char(int和char可以互换)。
引用类型:类类型,接口类型,数组类型。

7.java的引用类型:
引用与指针。
引用代表被引用的对象,它只是引用对象的代表,并不占用内存,也不能修改。如引用变量没有引用对象,则该引用变量=null。
指针存放对象的地址,它是一个变量,可以被修改,和其他变量一样,占用内存。

8.方法区
所有线程共享方法区,但为满足线程安全,方法区中每一个类必须被设定为临界资源,即同一时刻某一个类只能被一个线程访问。

9.类标识:
由于一个程序可以多次装载同一个类且该类可以存在于不同的名字空间中(即可由不同的装载器装载),因此必须将装载该类的装载器的标识加

上,才能唯一标识一个类。

10.对象
对象实例变量存储在堆中,对象符号引用则在常量池,方法属性表等可能出现的地方。通过对象的引用可以访问对象的实例数据和创建该对象

的类的数据。对象的引用指向堆中的对象。
实例结构有两种,见书本98页。

当调用对象的方法时,需要进行动态绑定。即,不能根据对象来确定需要调用的方法,而是根据对象的类数据来确定需要调用的方法。此时,

也需要通过对象的引用来访问类数据。
动态绑定就是在运行时才绑定,而不是在编译时绑定。

java虚拟机学习笔记1相关推荐

  1. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  2. Java虚拟机学习笔记(一)—Java虚拟机概述

    一:编程语言兼容底层系统的方式大概分为两种 1.通过编译器实现兼容 例如C.C++等编程语言,既能运行与Linux系统,也能运行与Windows系统:既能运行于x86平台,也能运行于AMD平台.这种能 ...

  3. 深入理解JAVA虚拟机学习笔记(一)JVM内存模型

    摘要:   上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状 ...

  4. Java 虚拟机学习笔记 | 运行时数据区总结

    前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...

  5. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  6. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  7. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析

    每天进步一点点! 今天我们一起看一下类加载的准备阶段和解析阶段. 先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段. 这里面的区 ...

  8. java outofmemory_深入理解JAVA虚拟机学习笔记3——OutOfMemoryError异常

    开门见山. 为了方便制造溢出,将JAVA堆的大小调整为10M. 本机用的是IntelliJ IDEA作为开发工具,进入到IDEA的安装目录,如D:\tools\IntelliJ IDEA 2017.1 ...

  9. java虚拟机学习笔记 【3】

    为什么80%的码农都做不了架构师?>>>    认识Java虚拟机的内部体系结构 Java虚拟机的内部体系结构也许很少有人去关心,因为对于Java程序员来说,一般只需要跟API打交道 ...

  10. Java虚拟机学习笔记(一)--运行时数据区域

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 前言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域. 程 ...

最新文章

  1. 配置数据库引擎BDE(Borland DataBase Engine)
  2. [数据结构]用插入排序和选择排序的思想实现优先级队列
  3. faster rcnn一些博客
  4. 【已解决】罗技K380蓝牙键盘可以连接电脑,但无法输入怎么办?
  5. 算法笔记_045:币值最大化问题(Java)
  6. mysql url 解析json数据_如何在MySQL中编写可以解析列中JSON数据的查...
  7. Microsoft Teams 当前页面脚本发生错误/例外被抛出且未被接住
  8. Java JDK8下载 (jdk-8u251-windows-x64和jdk-8u271-linux-x64.tar)
  9. linux基础知识大纲
  10. 通过快递100获取快递单号,结合c-lodop热敏纸打印 – 通过菜鸟ISV/自研ERP使用菜鸟电子面单...
  11. 我们问了人工智能ChatGPT十个运维问题,结果发现...
  12. 小伙利用Python绘制999种玫瑰花表白女神,会编程男孩子真好
  13. 微信小程序实现锚点跳转
  14. 决策树(Decision Trees)
  15. 【转贴】看星际争霸人工智能伯克利如何“主宰”了“2010星际争霸人工智能挑战赛”...
  16. 速率法和终点法的区别_生化反应曲线解析1(终点法)
  17. 学python的亲身经历_你要偷偷的学Python,然后惊呆所有人
  18. 一起来捉妖 灵石秒开过程 IOS版(越狱与不越狱都可以)
  19. moba寻路_GitHub - ylmbtm/MoBaDemo: 用Unity做的一个类Moba游戏Demo
  20. 计算机检测报告素材,笔记本检测报告模板.doc

热门文章

  1. springIOC,IOP概念和实现原理
  2. 四旋翼无人机学习第13节--Padstack Editor的简单使用
  3. 【多态】【虚表指针与虚表】【多继承中的多态】
  4. css 水平居中和垂直居中
  5. An infrared and visible image fusion algorithm based on ResNet‑152
  6. 网络安全应急响应技术实战指南(奇安信)
  7. 最近的状态与王者农药
  8. vbs 叫爸爸恶搞代码
  9. 查询server服务器版本信息,sqlserver多版本查看版本号
  10. 地球online中国大区各服务器最近屡次发生高等级玩家砍死小号事件~