java虚拟机--JVM

  • java虚拟机

      是安装在计算机操作系统上的一个虚拟计算机。

      专门用于处理java程序和底层操作系统的链接工作,将java程序翻译成底层的操作系统可以理解的语言。

      有别于JDK。JDK是java的开发环境,是java开发人员需要的,里面除了JVM,还有一些其他的东西。JVM是小于JDK的。

JVM的结构图如下图所示:

    1. 类加载器:加载类文件到内存。[这里的类文件是class文件]

    2. 运行数据区:1中加载的class文件,全部保存在运行数据区。java能够很好的运行,也是得益于运行数据区的管理。

    3. 执行引擎:也叫做解释器,负责讲class文件解释成操作系统的语言。

    4. 本地接口:本地接口的初衷是为了实现java中调用其他的C/C++的程序,于是就在内存中开辟了一个本地方法栈,用于等级本地方法,然后在执行引擎的时候调用本地方法。[现在使用的越来越少了]

  • java内存管理

    1. 栈-stack

      是java的程序运行区,在线程创建的时候创建,生命周期跟随线程的生命周期,所以栈中不存在垃圾回收的问题。

      栈中存放是数据包括:

              本地变量[输入参数、输出参数以及方法内的参数];

              栈操作[记录入栈和出栈的操作];

              栈帧数据[类文件、方法等]。

  

    2. 堆

     一个JVM实例中存放一个堆内存,堆内存的大小是可以调节的。类加载器读了类的文件后需要把类、方法、常变量放置在堆中。

     堆内存又分为:

      1) 永久存储区

        常驻内存中的区域,存放JDK自身所携带的class、interface的元数据,都是一些运行环境必须的资源信息。不会被垃圾回收器回收。

      2)新生区

        类产生的区域。新生区又被分为两个部分:伊甸区和幸存者区。幸存区又被分为0区和1区。伊甸区new出新的类,当伊甸区满的时候,垃圾回收将这个区域整理回收,没有被回收的放到0区去。0区满了,垃圾回收又整理回收,没有回收的放到1区去。1区满了就整理到养老去去。

      3)养老区

        

      3. 方法区

        被所有的线程所共享,保存:字段和方法字节码,以及一些特殊的方法如构造函数和接口代码。这里保存的有类变量。

      4. PC register 程序计数器

        指导执行引擎找到下一条指令

      5. 本地方法栈

  • 相关问题

    堆和栈区别

       对存放的是对象,而对象内的临时变量存放在栈内存中;栈是跟随线程的,堆是跟随JVM。

    类变量和实例变量的区别

       类变量前面有static修饰,是类的变量;实例变量的实例new出来的。类变量存储在方法区中;实例变量存储在堆中。

    java的方法传递的是值OR地址

         都不是,对于原生数据传递的值,引用类型传递的地址。   

原文地址:https://www.cnblogs.com/lxq0309/p/3742095.html