JVM内存模型学习(入门)

新手Java开发,探究比较浅,只是记录学习, 如果对您有帮助,荣幸之至。如有大佬,请指教

JVM运行机制

通过javac编译java文件,生成.class字节码文件
javap -c -p JvmDemo.class查看运行过程
javac JvmDemo.java
javap -c -p JvmDemo.class

PS H:\JavaPe> javac JvmDemo.java
PS H:\JavaPe> javap -c -p JvmDemo.class
Compiled from "JvmDemo.java"
public class Test.JvmDemo {
  public Test.JvmDemo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/util/ArrayList
       3: dup
       4: invokespecial #3                  // Method java/util/ArrayList."<init>":()V
       7: astore_1
       8: iconst_0
       9: istore_2
      10: iload_2
      11: bipush        100
      13: if_icmpge     54
      16: iload_2
      17: iconst_2
      18: irem
      19: ifne          48
      22: aload_1
      23: new           #4                  // class java/lang/StringBuilder
      26: dup
      27: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      30: ldc           #6                  // String 插入了
      32: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      35: iload_2
      36: invokevirtual #8                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      39: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      42: invokeinterface #10,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      47: pop
      48: iinc          2, 1
      51: goto          10
      54: return

这里的行号和Eclipse之类的程序工具上的不是同一个,这里的是JVM运行时,从上至下运行。

什么是内存模型

任何Java项目写好后,主体都是一个个的类文件,这些文件会被JVM运行,因此这些文件中的各项信息都会存放在JVM的内存中,如何保存就设涉及到了JVM内存模型了。

JVM内存模型

程序计数器(线程私有)

程序计数器是JVM记录当前线程所执行的字节码文件的行号指示器(即上面提到的行号)。选择语句、循环语句、各种逻辑判断都是由程序计数器来搞定。

Java虚拟机栈(线程私有)

用于存放局部变量

每个方法被执行的时候,都会在这个栈上创建一个栈帧,这个栈帧中用于存放 局部变量 表。每一个方法被调用,直到执行完成,就是一个栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量都是线程安全的,全局变量可能会产生多线程时安全问题

本地方法栈(线程私有)

Java虚拟机栈处理的是java方法,本地方法栈处理的是Native方法(C/C++编写的),属于底层方法。

Java堆(线程共享)

堆的主要目的就是存放对象的实例。应该是虚拟机内存中最大的一块,被所有线程共享。在虚拟机启动时就会被创建,是GC管理的主要区域,也被称为"GC"堆。

方法区(线程共享)

存储已被虚拟机加载的类的相关信息、常量、静态变量

运行时常量池

属于方法区的一部分。常量,用于存放编译时产生的各种字面量和符号引用,这一系列内容会在类加载后放在方法区的运行时常量池中。

例子

Student stu = new Student();
/*
 *其中 stu 存放在栈中
 */

在内存中运行代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值