内存结构

程序计数器

作用:
1.记录正在执行的jvm指令的执行地址
字节码解释器会去通过改变计数器的值,向程序计数器中要下一条要执行的字节码指令的地址
2.记录现场 线程切换回来在正确的执行位置
特点:线程私有 内存不会溢出

虚拟机栈

  • 1.线程执行需要的内存叫栈 栈中的变量都不会被垃圾回收 因为自己就销毁了
  • 2.当前线程的方法执行需要的内存叫栈帧
    2.1 每个栈帧中包含形参,方法內的局部变量表,返回值地址,接口等
    2.2
    方法內部的局部变量是私有的,线程安全的
    线程安全:不会同时被多个线程共享的资源 线程独有
    2.3
    方法形参要看形参是什么来判断它是否是线程安全的,
    首先形参都会面临被多个线程同时调用的,比如两个线程都调用这个函数,对这个形参进行操作。但这个形参如果自身是线程安全的比如StringBuffer那就线程安全,如果是StringBuilder就是线程不安全的,就应该把形参修改为自身是线程安全的性质的StringBuffer。
    2.4 方法的返回值也是要看自身是否是现成安全的来判断
    因为 形参和返回值已经脱离了方法的作用域
    内存结构_第1张图片

本地方法栈

定义:本地方法(不是由java代码编写的代码)执行时的内存空间
方法时native修饰的并且没有方法体
Object类里的clone() hashcode() notify() wait()等都是

在这里插入图片描述
内存结构_第2张图片
list是在try 中被声明的 直到出异常才进入catch 才结束自己的生命能够被回收
所以list是一致被调用的
a也是一致被调用的 两个人都一直被调用最后直到堆溢出

方法区

1.里面存储:
类的相关信息(类加载器。。方法 构造器),
运行时常量池(常量 静态变量)
2.方法区在虚拟机被启动时创建 ,逻辑上是堆的组成部分,
内存结构_第3张图片
.class文件通常是包括
类的基本信息(路径,最后修改时间,类的访问修饰符,包名类名,jdk版本,自身类,父类,接口,)
+类的方法定义(构造方法,main方法,包含虚拟机指令)
以下是main方法转为虚拟机指令
内存结构_第4张图片
其中的序号会去常量池中找 比如ldc找常量池的#3
+常量池
在这里插入图片描述
常量池中#3会去找#23
内存结构_第5张图片

运行时常量池

常量池存在于.class文件中,类加载后 常量池信息会放入到运行常量池中

你可能感兴趣的:(2.,jvm)