JVM内存管理

1.JVM与操作系统的关系

jvm与操作系统的关系.png

  JVM全称Java Virtual Machine(Java虚拟机)。JVM屏蔽了与具体操作系统平台(Linux、Windows、MacOS等)相关信息,使Java程序只需要生成JVM上运行的目标代码(字节码),就可以在多种不同平台上运行。JVM在执行字节码时,会把字节码翻译成具体平台上的机器指令(机器语言010101),这就是JVM的跨平台特征。JVM只识别字节码,像Kotlin、Groovy、Jruby等语言,他们也能编译成字节码,所以也能在JVM上跑,这个就是JVM的跨语言特征。

2.Java SE 体系架构

JVM只是一个翻译,在不同操作系统中运行,需要依赖于Java SE体系架构
https://docs.oracle.com/javase/8/docs/

java se体系图.png

3.JVM整体

jvm运行过程.png

  .java文件经过javac编译成.class(字节码),Java类加载器把字节码加载到JVM的运行时数据区(JVM管理的内存),执行引擎把运行时数据区的数据进行执行。

运行时数据区

运行时数据区.png

自动化内存管理

定义:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
类型:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区(运行时常量池)、直接内存。
线程隔离数据区:也叫线程私有区,在jvm中运行多个线程,每个线程都有虚拟机栈、本地方法栈、程序计数器。
方法区: 放class 、静态变量、常量
堆:几乎所有的对象都在堆中分配

①程序计数器

指向当前线程正在执行的字节码指令的地址。

/**
 * @author Sun
 * 栈帧执行对内存区域的影响
 */
public class Test {

    public int work(){//在运行过程中,打包一个栈帧
        int x=1;//x是一个局部变量
        int y=2;
        int z=(x+y)*10;
        return z;
    }

    public static void main(String[] args) {
        Test test=new Test();
        test.work();
    }
}

Android studio查看字节码:Preferences—>Tools—>External Tools 添加External Tools,添加好后保存。使用:右键.java文件—>External Tools—>Show Byte Code。

show byte code.png

如图配置:Name、Program、Arguments、Working directory
Show Byte Code (这个自己命名就好)
$JDKPath$\bin\javap
-c -verbose $FileClass$
$OutputPath$

我们来看一下上面的work方法的字节码片段:

public int work();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: iconst_1                    //将int类型1入操作数栈
         1: istore_1                    //将操作数栈中栈顶int类型数值,存入局部变量表(下标为1的位置)
         2: iconst_2                    //将int类型2入操作数栈
         3: istore_2                    //将操作数栈中栈顶int类型数值,存入局部变量表(下标为2的位置)
         4: iload_1                     //将局部变量表中下标为1的int类型数据入栈
         5: iload_2                     //将局部变量表中下标为2的int类型数据入栈
         6: iadd                        //1.将栈顶2个int类型数值出栈  2.相加    3.将结果压入操作数栈
         7: bipush        10            //10的值扩展成int值入操作数栈
         9: imul                        //1.将栈顶2个int类型数值出栈  2.相乘    3.将结果压入操作数栈
        10: istore_3                    //将操作数栈中栈顶int类型数值,存入局部变量表(下标为3的位置)
        11: iload_3                     //将局部变量表中下标为3的int类型数据入栈
        12: ireturn
          
        ...

字节码code行号,针对work方法体的偏移量。

简单理解为:程序计数器,记录字节码的地址。

为什么需要程序计数器?时间片轮转机制,线程在执行的时候被切出去了,记录一下执行到哪里了

程序计数器是JVM内存区域中唯一不会OOM,因为程序计数器是一块很小的区域,只需要记录地址,int类型就够了。

②虚拟机栈

存储当前线程运行方法所需的数据,指令、返回地址。

每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用。

栈帧:

栈帧.png

在每个Java方法被调用的时候,都会创建一个栈帧,并入虚拟机栈,一旦完成相应的调用,则出栈。

每个栈帧包含四个区域:局部变量表、操作数栈、动态连接、返回地址

  • 局部变量表:用来存放局部变量的(8大基本数据类型和引用类型)
  • 操作数栈:用来存放方法执行的操作数的,参与计算的数据会频繁的入栈和出栈。(基于解释执行)
  • 动态连接:多态,运行时才能确定具体的方法
  • 完成出口:正常返回(调用程序计数器中的地址作为返回),异常(通过异常处理表来确定)

③本地方法栈

本地方法栈保存的是native方法的信息
当一个JVM创建的线程调用native方法后,JVM不再为其在虚拟机栈中创建栈帧,JVM只是简单的动态链接并直接调用native方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容