Java中的内存分析
堆
- 可以存档new的对象和数组
- 可以被所有的线程共享,不会存放别的对象引用
栈
- 存放基本变量类型(会包含这个基本类型的具体数值)
- 引用对象的变量(会存放这个引用在堆里的具体地址)
方法区
- 可以被所有的线程共享
- 包含了所有的class和static变量
面向对象(Object-Oriented Programming, OOP)
PS: 个人感觉可以参照之前C++面向对象学习思路,主体脉络和语法非常多相似之处
三大特性
创建对象的内存分析
如代码:
public class MyClass {
String str;
public static void main(String[] args) {
MyClass obj = new HisClass();
obj.str = "Hello";
}
}
- 方法区加载类和main方法(此时加载的是main定义和字节码,这是类的元数据的一部分,是静态的、共享的)
- 方法区中的常量池加载一些常量,也是在类加载时期进行
- main方法存储在栈区(此时加载的是运行时状态,包括局部变量、操作数栈等,这是动态的、与具体调用相关的)
- 而后进行类的实例化时,c作为引用变量名加载至栈区,而在堆区new了一块区域,并使用栈区中的一些局部变量(基本变量)和一些常量池的如字符串等进行成员赋值
- 当类加载时,所有静态方法都会加载到静态方法区,而后所有该类的对象实例后都可以调用该方法