一、JAVA内存总体架构
- 多个线程里面有:程序计数器、虚拟机栈、本地方法栈
- 方法区:运行时常量池
- 堆:新生代和老生代,用于做对象的管理
- 直接内存和其他内存
二、栈的特点如下
- 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧
- 先进后出,后进先出
- 栈系统自动会分配,速度快,是连续内存空间
- jvm为每个线程创建一个栈
- 栈为线程私有,不可共享
三、堆的特点如下
- 堆用于存储创建好的对象和数组(也是对象)
- 堆是一个不连续的内存空间,分配灵活,速度慢(需要查找)
- jvm只有一个堆,所有线程共享
四、方法区(又叫静态区,也是堆)特点如下
- 方法区是java虚拟机规范,可以有不同的实现,jdk8是元数据空间和堆结合起来
- 方法区也是堆,只是用于存储类、常量相关的信息
- 用来存放程序中永远不变或唯一的内容
- jvm只有一个方法区,所有线程共享
五、this的本质
- this的本质就是当前对象的地址,普通方法中指向调用该方法的对象,构造方法中指向初始化对象
- this可以调用重载的构造器!这种方法必须位于构造方法第一行,例如:之前方法已经定义this.id=id;this.name=name;再重载构造器中可以直接this(id,name)不用重复声明。
- 作为方法链式调用:通过在方法中返回"this",可以实现。这在建造者模式和流式API中很常见
六、static的本质
用static声明的变量为静态成员变量,也称为类变量。
- 它从属于类,只有一份,在类被载入时显示初始化。
- 一般用 类名.类属性/方法 来调用
- 在static方法中不可直接访问非static成员,因为非static成员属于对象
七、静态初始化块
- 构造方法用于对象的初始化!
- 静态初始化块,用于类的初始化操作!
- 可以初始化static属性
- 在静态初始化块中不能直接访问非static成员