文档章节

1,认识JVM

天呀鲁哇
 天呀鲁哇
发布于 2017/07/25 13:44
字数 1112
阅读 29
收藏 0
点赞 0
评论 0

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虚拟机>>

    

© 著作权归作者所有

共有 人打赏支持
天呀鲁哇
粉丝 8
博文 82
码字总数 42007
作品 0
长宁
程序员
Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

centos7 yum安装java运行环境,初识hadoop

安装java运行环境 1.实验机相关信息: [root@node2 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@node2 ~]# uname -r 3.10.0-327.el7.x86_6 2.配置epel源,以y......

smile68 ⋅ 04/21 ⋅ 0

ThreadLocal源码分析

阅读原文请访问我的博客 BrightLoong's Blog 一. 简介 提醒篇幅较大需耐心。 简介来自ThreadLocal类注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线...

BrightLoong ⋅ 05/28 ⋅ 0

学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

MyCAT SQL ON MongoDB

概述 可能你在看到这个标题会小小的吃惊,MyCAT 能使用 MongoDB 做数据节点。是的,没错,确实可以。 吼吼吼,让我们开启这段神奇的“旅途”。 本文主要分成四部分: 总体流程,让你有个整体...

wangchen1999 ⋅ 05/02 ⋅ 0

Java 10 实战第 1 篇:局部变量类型推断

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。 今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是...

Java技术栈 ⋅ 06/11 ⋅ 0

🛠VS Code编辑器配置Java开发环境

🛠VS Code编辑器配置Java开发环境 一、简述 及讨论 由于学校课程的原因,是基本以java开发为主线的课程,但是我对java兴趣不大,又加上我不太喜欢 「Eclipse」这个java的集成开发环境(简称...

Cc卿 ⋅ 06/02 ⋅ 0

MVN package install error javac: invalid target release: 1.8

现象: --------------------------------- [ERROR] Failure executing javac, but could not parse the error: javac: invalid target release: 1.8 Usage: javac <options> <source files>......

孟飞阳 ⋅ 05/04 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

jdk的下载与安装(windows环境下) - 图解

一、JDK的下载(当前演示版本为jdk 1.8.0_171) 1.下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.同意相关协议,再下载对应版本的jdk(w...

qq_34256296 ⋅ 05/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部