JVM—JVM内存模型

本文主要讨论JVM内存模型,捎带会有点点JMM的讲解(因为硬件我懂得不多。。。)

相信大家出去面试的人都有过这样的经历,面试官:说一下你对JVM的了解?JVM怎么调优?其实作为Java程序员确实有必要知道JVM的内存模型。

抄一段官方介绍:Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范,自己扯一段首先JVM是一种规范,是虚构出来的一种概念一种规范,可以理解为用来连接编程语言(Java,Scala等)与操作系统的中间层,我们知道无论什么语言执行一个程序,最终是交给计算机的cpu来执行的,那怎么java怎么交给cpu执行呢,第一步是Java通过jvm来沟通操作系统(这也是Java可以跨平台的原因),第二步通过操作系统来沟通cpu完成线程的任务(这是JMM涉及到的,放到下一篇博客介绍吧)。

下面进入正题:

 

上面图就是我们常说的JVM的内部结构,当然了运行时数据区就是今天讨论的重点,当然其他部分也会介绍。这个东西不好画图(不过编译加载这些倒是好画,但是我就不,嗯哼!),下面先介绍JVM的的组成部分,然后再介绍今天的主题运行时数据区(字会有点多,但是希望好好看,至少面试有帮助,哈哈)

如上图JVM包括:类装载子系统,运行时数据区,执行引擎,本地接口

类装载子系统:作用是加载类文件到内存,比如编写一个HelloWord.java 程序,然后通过javac 编译成class 文件,那怎么才能加载到内存中被执行呢?就是装在子系统中的Class Loader 承担的就是这个责任。

运行时数据区:是整个JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行,为什么我们都说Java 天下第一,Java的生态系统这么繁荣昌盛,我觉得就是运行时数据区的各种治理很完善,哎这些大神是真的牛(下面详细介绍)。

执行引擎:也叫解释器,负责解释JVM中的命令,提交操作系统执行,反正是来沟通操作系统的(具体原理不要问我,问就是不懂)。

本地接口:是融合不同的编程语言为Java 所用,它的初衷是融合C/C++ 程序,Java 诞生的时候是C/C++ 横行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++ 程序,于是就在内存中专门开辟了一块区域处理标记为native 的代码,它的具体做法是本地方法栈(下面要介绍)中登记native 方法,在Execution Engine 执行时加载native libraies 。目前该方法使用的是越来越少了,除非是与硬件有关的应用,比如通过Java 程序驱动打印机,或者Java 系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket 通信等,这里不多做介绍。

下面就介绍一下JVM中最重要的部分:运行时数据区

1.方法区:线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量,比如static修饰的变量加载类的时候就被加载到方法区中。

2.堆:线程共享的,存放对象(不绝对)和数组,常量池,堆内存 = 新生代+老生代+持久代,新生代分为Eden和2个交换区,比例8:1:1,新生代老生代1:2,对象优先在Eden分配,长期存活(垃圾回收15次)和大的对象进入老年代;是垃圾收集器管理的主要区域,别名“GC 堆”,小名“垃圾堆”。。。再深入就是垃圾回收的各种算法和机制了(我只是了解皮毛,就不献丑了)

3.栈:是线程私有的,一个线程运行时jvm就开辟了了一个栈内存,栈中存放一个个栈帧,每个栈帧对应一个被调用的方法,当线程执行一个方法时,就会创建一个对应的栈帧,并且将栈帧压栈(就是我们常说的后入先出),方法执行完,栈帧出栈(栈帧包含:方法执行需要的操作数栈(方法的局部变量的临时存值的地方),局部变量表(根据指令行来控制变量的,因为变量的操作无论加减等操作都是指令来控制的),动态链接(调用对象方法时,对象引用根据动态链接在方法区找到类元信息,然后才能执行里面的指令),返回地址(线程将在A方法中调用B方法执行完后,将该线程的程序计数器重新指向A调用B方法时的执行位置)。

4.程序计数器:当前线程正在执行或者马上要执行的下一个指令的行号;在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰。

5.本地方法栈:与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务(一个java调用非java代码的接口),比如CAS就是调用了Java提供的unsafe方法,来调用C语言的方法。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值