zoukankan      html  css  js  c++  java
  • java jvm虚拟机

    一、jvm的组成

            

      对比上图,jvm由主要由两个重要组件和五个内存区间组成:

      两个重要组件:类加载子系统:class loader subsystem  、 执行引擎:execution engine

      五个内存区间:方法区、堆、java栈、程序寄存器、本地方法栈

      1、类加载子系统

        负责查找并装载Class 文件到内存,最终形成可以被虚拟机直接使用的Java类型。

      2、执行引擎

        负责执行字节码。方法的字节码是由Java虚拟机的指令序列构成的。每一条指令包含一个单字节的操作码,后面跟随0个或多个操作数。执行引擎执行字节码时,首先取得一个操作码,如果操作码有操作数,取得它的操作数。它执行操作码和跟随的操作数规定的动作,然后再取得下一个操作码。这个执行字节码的过程在线程完成前将一直持续。

      3、java栈

        Java栈是线程私有的。每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。

        java栈一般保存的数据有:基本类型数据、对象的引用、局部变量、函数调用时的参数、返回地址、返回数据等。

      4、堆

        当Java程序创建一个类的实例或者数组时,都在堆中为新的对象分配内存。虚拟机中只有一个堆,所有的线程都共享他。

        堆是垃圾收集器管理的主要区域。

        堆一般保存的数据有:通过new关键字和构造器创建的对象、数组等。

      5、方法区

        在类装载器加载class文件到内存的过程中,虚拟机会提取其中的类型信息,并将这些信息存储到方法区。

        方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

        由于所有线程都共享方法区,因此它们对方法区数据的访问必须被设计为是线程安全的。

      6、程序计数器

        每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。

        PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

      7、本地方法栈

        本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态链接并直接调用指定的本地方法。如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。

      补充:字符串池 、常量池(指的是运行时常量池)

      字符串池在DataSegument里。既不在堆也不再栈中。 用+创建应该是在堆里。

      String s1 = "abc“;  "abc"内容放在字符串池中,“abc"的引用放在java栈中。

      String s2 =new String("def"); "def"内容放在堆中,"def"的引用放在java栈中。

      常量池:它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编  译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

      

        参考资料:http://java.chinaitlab.com/Jvm/906576.html

  • 相关阅读:
    selenium
    selenium
    selenium
    selenium-控制浏览器操作
    selenium元素定位
    selenium测试-open chrome
    selenium环境搭建
    selenium简介
    74 计算机图形学开源处理库
    73 QT编程入门
  • 原文地址:https://www.cnblogs.com/Zchaowu/p/7455834.html
Copyright © 2011-2022 走看看