1,认识JVM
1,认识JVM
天呀鲁哇 发表于4个月前
1,认识JVM
  • 发表于 4个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

JVM简介

    JVM(Java virtual machine)笼统的的说法是它是一个用来运行Java程序的抽象电脑;我们可以把它看作是我们常用的操作系统,用来运行Java程序的;    

    那么JVM到底是什么?

    我们可以从一个JVM产品的产生过程来了解: 1,一个JVM的产生首先要定义抽象规范的,如果没有规范 没有标准则产出的JVM无法面向大众使用. 2,有了抽象规范之后就是对规范的实现 这个时候的JVM才算是有一个实际产物. 3,最后是对JVM的使用 产生一个实例!

    总结而知JVM是对JVM规范实现的能够正确运行相关程序的特殊平台软件;

    既然是平台软件那么他就需要依赖操作系统从而来协调相关硬件资源,但是我们常说的JVM与平台无关性说的是什么呢? 其实JVM的实现中 都是有自己的内存模型  指令系统 从而实现了我们只需要关心我们自己的Java程序而不用关心底层是如何调用硬件的; 这也是为什么我们可以把它看成操作系统;

    从一个java程序运行顺序来说,我们在源码的基础上需要对其编译;生产Java标准的二进制.class文件;

    在此我们需要区分一下 java javac  jvm  jre  jdk 等名词的概念; Java是我们源码的后缀,是用来给程序编写人员阅读 维护的(属于高级编程语言范畴); javac 是Java编译器, 编译Java文件,产物是Java标准二进制文件; jvm则是解释执行.class文件的容器; jre则是Java Runtime Environment ,它涵盖了 .class运行需要的类库 以及解释执行.class的jvm; jdk则是Java development Kit,在jre的基础上涵盖了javac,它主要给开发人员使用的集合工具;

    由于本文主要为了学习JVM,则下面主要了解JVM相关的东西;

.class文件

    .class是jvm执行的二进制文件;(其与编程语言无关);

    class文件结构:

ClassFile { 
    u4 magic; 
    u2 minor_version; 
    u2 major_version; 
    u2 constant_pool_count; 
    cp_info constant_pool[constant_pool_count-1]; 
    u2 access_flags; 
    u2 this_class; 
    u2 super_class; 
    u2 interfaces_count; 
    u2 interfaces[interfaces_count]; 
    u2 fields_count; field_info fields[fields_count]; 
    u2 fields;
    u2 methods_count; method_info methods[methods_count]; 
    u2 mrthods
    u2 attributes_count; attribute_info attributes[attributes_count]; 
    u2 attributes
}

    (u2 u4 等表示的是class文件基础数据类型)

    magic(魔数):

    在class文件开始的4个字节主要存放magic(魔数) 主要是用来jvm区分这个文件是不是.class编码,我们不能仅仅使用文件后缀来区分 而是通过文件的内容来区别(保险 防止直接修改后缀产生.class文件);Sun规定这个魔数值必须是:0xCAFEBABE 

     minor_version|major_version:

     这两个是主版本号和此版本号,紧跟魔数之后的四个字节;

     constant_pool_count |constant_pool:

      在版本号之后是常量池相关信息;它包含了类或者接口相关常量的信息;常量池存储的是文字字符串 final变量 类名和方法名的常量;

     access_flag:

      常量池信息之后是访问表示字段信息;其主要用来描述此class是接口还是类  是public还是private等信息;

       ......(其他信息都是我们能够看的懂的  一一与我们代码相对应  通过面向对象思想完全可以理解)

 

JVM运行机制:

    当有了.class文件之后 jvm到底是怎么去读取.class信息和执行程序的呢?

    JVM实例的生命周期:

    当我们运行一个主程序入口的时候,一个JVM实例就会产生;直到这个程序运行完毕 则这个jvm实例则会消亡(收回内存); 当我们启动main方法之后会开启一个线程;这个线程是非守护线程,守护线程通常是jvm自己使用和管理的  比如gc;

JVM体系结构:

 

    类加载器主要负责吧class加载到内存中;运行时数据空间就是Java 的内存模型,主要描述了Java程序在运行时数据如何在内存中交换;执行引擎负责计算和执行程序 就像cpu一样 负责调动;

 

 推荐文档:https://en.wikipedia.org/wiki/Java_virtual_machine

 推荐数据:<<深入Java虚拟机>>

    

共有 人打赏支持
粉丝 9
博文 82
码字总数 42007
×
天呀鲁哇
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: