`
gogole_09
  • 浏览: 201932 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java虚拟机简述

阅读更多

       作为一个Java程序员,每天都与JVM在打交道,那么JVM到底是什么?它的内部原理有哪些神秘之处? 今天我利用这篇文章来解释解释, 也当作自己的《深入Java虚拟机》的读书笔记。 希望各位看官多多指教.

 

       下面的内容,我会以一问一答的形式来整理,总结,带着问题去学习,我认为是效率最高的学习方法。

 

一、为什么叫虚拟机?

     之所以叫虚拟机,是因为它仅仅是一个规范定义的抽象计算机.所以,要运行某个Java程序,首先需要一个符合该规范的具体实现,所以也就有了现在的Sun 虚拟机和IBM 虚拟机等不同虚拟机的出现 .

    所以,当我们说道Java虚拟机的时候,就意味着下面3个不同的事物: 

  •    抽象规范
  • 一个具体实现
  • 一个运行中的虚拟机实例

二、JVM的生命周期是怎样的?

     一个运行时的java虚拟机的天职是负责运行一个Java程序。 也就是说, 当启动一个Java程序时,一个虚拟机的实例就诞生了,当该程序关闭时,虚拟机的实例也就退出了。

     如果在同时运三个Java程序,将得到3个虚拟机的实例. Java虚拟机通过调用某个初始类的main()方法来运行一个Java程序,而main()方法有签名限制,也就是我们常见到的 public、static、void并且接受一个字符串数组为参数.

     Java程序初始化类的main()方法,将作为程序的初始线程起点,任何其他的线程都是由这个初始线程启动的。

 

    PS:关于JVM中线程的那些事(这里简单罗列一下,后续会有文章专门来介绍JVM线程机制.)

         JVM内部分两种线程: 守护线程与非守护线程.  

                  守护线程通常为JVM自己创建,当然,你也可以自己将某个线程设置为守护线程。 通常这样的线程应用于

            JVM内部作业,比如说: 垃圾回收的线程。

                   而像初始线程---开始main()方法的那个线程既叫非守护线程。 只要有任何非守护线程还在运行,那么这个

            Java程序还将继续运行着,当所有非守护线程都运行结束了,虚拟机实例将自动退出。 当然,你也可以在程序中

            显示的调用Runtime或者System类的exit()方法来退出.

 

三、JVM的体系结构是怎么样的?

     在JAVA虚拟机的规范中,一个JVM的实例应该按照以下:

  • 子系统
  • 内存区
  • 数据结构
  • 指令

这么几个术语来描述.(这里仅仅列出概念,后续会详细解释)

 这里利用一个图来说明:(来源于网络,版权信息不详,如有侵权,请告知)

 

 

  如上图中所示: 每一个JVM实例,都会有的以下2个东西:

  •        类装载器子系统 ----- 负责根据给定的全限名来装入类型(类或者接口)
  •       执行引擎 --------------负责执行哪些包含在被装载类的方法中的指令

类装载系统的作用?

    有过一定经验的Java程序员一般都知道这个系统的作用,这里我还是稍微总结一下,以让经验稍微欠缺的朋友了解一下,它在JVM中的主要作用是  负责查找并加载类型。

   JVM中分两种类装载器:

  • 启动类装载器
  • 自定义类装载器

   前者是JVM的一部分,而后者则是Java程序的一部分,这意味着,启动类加载器一般我们无法修改与指定,而自定义类装载器我们可以通过程序来指定。

    启动类加载器:

        每个JVM实现都必须有一个启动类加载器,它知道如何加载受信任的类,比如Java api的class文件,至于如何去寻找这些class,由不同的JVM实现者而不同,就像是不同的JDBC驱动一样,根据厂商的不同而不同的。

    自定义类加载器:

        自定义类加载器需要继承Java核心的java.lang.ClassLoader类, 跟所有的对象一样,自定义类加载器与Class类的实例都保存在JVM的堆中。

    而对于类装载器的装载顺序,如下:

  1.  装载,查找并装载类型的二进制数据
  2. 连接,执行验证(确保导入类型正确),准备(为类分配内存初始化为默认值)以及解析(把类型中的符号引用转成直接引用)
  3. 初始化,把类变量初始化为正确的初始值

 那上图中

运行时数据区是做什么用的??

     当JVM运行一个程序,它需要存储很多东西到内存中,比如 字节码、从装载的class文件中得到其他信息、程序创建的对象、传递给方法的参数、返回值、局部变量以及运行的中间结果等。 这些东西都被JVM组织到 运行时数据区 中,以便于管理。

 

方法区与堆的作用?

    另外需要注意的是: 每个JVM实例都有一个 方法区与一个堆, 他们被JVM实例的所有线程共享。 比如说: 当一个JVM装载一个class文件的时候,它会从class文件包含的二进制数据中解析出类型信息,并将它们放到方法区中,当程序运行时,虚拟机会把所有程序在运行时创建的对象都放到堆中。

 

方法区的具体细节是怎么样的?

     它存储着被装载类型的信息。它被所有的线程共享着,因此它们对方法区的访问必须被设计成线程安全的。 比如:两个线程加载一个类,而这个类还没有被装入JVM中,此时应该有一个线程去装载它,另外一个线程在等待。

     它会保存着装载类的如下信息:

  1. 类型的基本信息(类名,接口还是类、访问修饰符、实现的接口、父类名)    
  2. 该类型的常量池
  3. 字段信息(字段名、字段类型、修饰符)
  4. 方法信息(方法名、方法返回类型、参数数量与类型、修饰符)
  5. 静态变量
  6. 指向ClassLoader的引用(JVM需要知道,这个类型是谁加载的)
  7. 指向Class类的引用(以便获取类型的Class对象)

堆的具体细节是怎么样的?

   它保存这运行时创建的对象或者数组  ,而一个JVM只有一个堆空间看,所有线程都共享着这个空间。

   在JVM中,有一条在堆中分配新对象的指令,但是却没有释放内存的指令(其通过垃圾回收来实现).而垃圾回收器的具体实现也是由JVM的具体实现者来决定的。

 

JVM中的数据类型有哪些?

      JVM中,数据类型分两种:

  • 基本数据类型
  • 引用数据类型

 Java语言中,所有基本数据类型也都是JVM的基本数据类型,但是boolean有点特别,为什么?  因为当编译器将Java类编译成字节码后,它会用int或者byte表示Boolean 。

 另外,JVM中 ,false是由整数0来表示的,true为所有非零的整数表示。

 JVM中的数值类型分为两种   一种是 整数类型(byte,short,int,long,char) 

                                      另外一种是:浮点数类型(float,double)

在JVM内部,还有一个特殊的数据类型,Java程序员不允许使用,它被用来实现finally子句,

        它就是   returnAddress类型

 

 JVM中的引用数据类型有三种: 类类型、接口类型和数组类型。

        它们的值都是对动态创建的对象的引用。 值得注意的是 在JVM中,数组是一个真正的对象。

 

 

  

Java栈的作用?

    每一个新创建的线程,它都将获取它自己的PC寄存器(也叫程序计数器)和一个Java栈。 如果线程在执行一个Java方法时候,它的PC寄存器总是指向下一条需要执行的指令, 而它的Java栈则保存线程中Java方法的调用状态,比如: 它的局部变量、传入方法的参数、返回值、以及运算的中间结果等。

 

Java栈的结构:

    我们知道,Java栈用来保存线程调用一个非本地方法的java方法的状态, 那如果一个线程调用多个Java方法呢? 那每个Java方法的状态如何保存。

    在Java栈的内部,它是由许多的 栈帧 或者叫 帧组成的。 一个帧包含一个Java方法调用的状态,当线程调用一个Java方法时候,JVM压入一个新的Java栈帧进入Java栈; 当方法返回时,这个栈帧被从Java栈中弹出并抛弃。

 

 

 

 OK. 这篇文章就先写到这, 文章都是自己平时看书积累的一些笔记或心得。

 有的东西总结得还不是很全面,希望能让各位读者对JVM有一些初步的了解。

  • 大小: 9.1 KB
2
2
分享到:
评论

相关推荐

    java虚拟机的详细原理

    一、什么是Java虚拟机 二、Java虚拟机的生命周期 三、Java虚拟机的体系结构

    Java虚拟机工作原理详解

    Java虚拟机工作原理详解

    java虚拟机、进程周期,类加载1器和类使用要点简述

    类加载器 (类加载器使用双亲委派模型,为的是避免类的重复加载) 1、Java虚拟机与进程的生命周期 2、类的加载、连接与初始化 3、Java程序对类的使用可以分为两种:

    Android_Java基础

    1.1 java语言的简述 自从Java问世以来,其成长在计算机世界的每个角落。Java是对传统计算机程序设计模式的挑战,它对计算机软件开发和软件产业都产生了深远的影响。Java经过多年的发展,现在已经真正成为严格、主流...

    华为IBM的java面试题

    35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有...

    java面试宝典

    77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}这有何错误? 18 79、public class ...

    深入了解 JVM 虚拟机(超详细入门攻略)

    7. 简述 Java 垃圾回收机制8. 简述 Java 类加载机制9. 类加载器双亲委派模型机制10. 什么是类加载器,类加载器有哪些?11. 简述 java 内存分配与回收策率以及 Minor GC 和Major GC 1. 内存模型以及分区 JVM 分为堆区...

    JAVA面试题最全集

    35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有...

    JRE与JDK的区别

    开始接触Java的时候觉得Java虚拟机很麻烦,不明白JRE与JDK的区别是什么?后来搞清楚JRE是个运行环境,JDK是个开发环境。

    Java面试宝典-经典

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试宝典2010版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java面试题大全(2012版)

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    java面试题

    77.2. 修改java虚拟机内存 88 77.3. 修改tomcat连接数 88 77.4. 禁止列出目录下的文件 88 77.5. 设置session失效的时间 89 77.6. 设置MIME响应类型 89 77.7. 设置tomcat的默认访问页面 89 77.8. 设置tomcat管理用户 ...

    java 面试题 总结

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    Java ME平台上手机通信系统的设计与实现.pdf

    java ME是一种高度优化的java运行平台,它具有平台无关性、安全性、分布式等特点,广泛应用于机顶盒、移动...文章简述了java ME的体系结构,包括千字节虚拟机、连接设备配置、有限连接配置和移动信息设备简表,以及Ja...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【JVM】java虚拟机的区域如何划分,每一个区的动能? 49 程序计数器(Program Counter Register) 49 java虚拟机栈 50 java堆(Java Heap) 51 方法区 51 【JVM】JVM内存结构,GC垃圾收集解析 52 【JVM】双亲委派...

    最新Java面试宝典pdf版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    高级开发jvm面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的jvm...简述一下内存溢出的原因,如何排查线上问题? 内存溢出的原因 引用在gc中回收状况 为什么gc停止所有进程; 有几种垃圾回收器; 描述一下CMS和G1的异同;

    java基础题 很全面

    50. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 13 51. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 13 52. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表...

Global site tag (gtag.js) - Google Analytics