zoukankan      html  css  js  c++  java
  • Java Jvm运行机制原理

     

    一:简介

    在学习Java虚拟机之前,也就是Jvm之前,我想大家能够带着问题去学习,这样的话,大家学习起来也会比较有所获!

    1.Java虚拟机(Jvm)是什么? 
    2.Java虚拟机是用来干什么的? 
    3.Java虚拟机它的体系结构是什么样子的? 
    4.Java虚拟机在工作做扮演什么角色? 
    5.Java虚拟机在运行时数据区?

    二:Jvm基础概念

    Java虚拟机(Jvm)是可运行Java代码的假想计算机

    Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。

    在了解Jvm之前,大家如果有兴趣的,也可以先去了解下Java 中的堆和栈,可以观看上一篇: 
    Java 堆和栈的区别 http://blog.csdn.net/u011546655/article/details/52170470

    三:Jvm

    我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,也就是前面所有的Java虚拟机中的字节码指令集….编译成特定机器上的机器码

    也就是如下:

    1.Java源文件—->编译器—->字节码文件

    2.字节码文件—->Jvm—->机器码

    每一种平台的解释器是不同的,但是实现的虚拟机是相同的。这也就是Java为什么能够跨平台的原因了

    当一个程序从开始运行一个程序,这时虚拟机就开始实例化了。多个程序启动就会存在多个虚拟机实例。程序退出或者关闭。则虚拟机实例消亡。多个虚拟机实例之间数据不能共享。

    四:Jvm的体系结构

    Jvm的体系结构入下图:

     

    1、垃圾回收器

    垃圾回收器(又称为gc):是负责回收内存中无用的对象(好像地球人都知道),就是这些对象没有任何引用了,它就会被视为:垃圾,也就被干掉了。

    2、类装载子系统

    一听名字,大家就知道,肯定是用于操作我们编译好的.Class文件的系统,他作用如下:

    定位和导入二进制class文件 

    验证导入类的正确性 

    为类分配初始化内存 

    帮助解析符号引用

    3、执行引擎(Execution Engine

    执行包在装载类的方法中的指令,也就是方法

    4、运行区数据

    如上图:虚拟机内存或者Jvm内存,冲整个计算机内存中开辟一块内存存储Jvm需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器

    五:Jvm运行时数据区

    1.程序计数器

    当前线程执行字节码的信号指示器,线程是私有的,它的生命周期和线程相同分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

    2.虚拟机栈

    Java虚拟机栈描述的是Java方法(区别于native的本地方法)执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动作链接、方法出口等信息。

    线程私有,生命周期和线程相同,都有各个独立的计数器,各不影响。

    每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    3.本地方法栈

    和虚拟机方法栈差不多类似,但是本地方法栈是服务于虚拟机所使用到的Native方法服务

    4.本地方法区:

    只是执行Native 方法。

    如果这个区的内存不足也是会抛出StackOverflowError OutOfMemoryError 异常。

    六:堆

    堆这块区域是Jvm中最大的,应用的对象和数据都是存在这个区域。这块区域也是线程共享的。也是 gc 主要的回收区。

    其实这也就是大家听的比较多的:Java gc)垃圾回收器

    由于篇幅原因,我会在下一篇中重点讲解下:Java gc回收器 的原理分析

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/8977218.html
Copyright © 2011-2022 走看看