内存结构

程序计数器

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

虚拟机栈

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

本地方法栈

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

list是在try 中被声明的 直到出异常才进入catch 才结束自己的生命能够被回收 所以list是一致被调用的 a也是一致被调用的 两个人都一直被调用最后直到堆溢出

方法区

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

运行时常量池

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

经验分享 程序员 微信小程序 职场和发展