一:栈
栈区是被每个线程所有的,伴随线程的创建而创建,线程执行完毕后,所属的栈也会消失。
栈占有的是连续的内存。所以它的执行速度会比较快。
栈中存放的是基本数据类型和引用数据类型的引用。
每次向栈中压入的都是方法帧。
例子:

public class StackTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int a=3;
		test t1=new test();
		t1.fun(1,2);
		
	}

}
class test{
	int ta;
	int tb;
	public void fun(int f1,int f2) {}
}

类加载器会先找到main方法,并将main方法所在的类加载到内存。在栈中会先把main方法压栈,(test类会在第一次new的时候加载)调用到fun方法时,再将fun方法压栈。具体就是下面这样:
java学习笔记(三)栈,堆,方法区。
二:堆
堆区被所有线程所共享。
堆区存放的是对象本身。
堆区可以分为新生代和老年代(涉及到垃圾回收机制)
代码:

public class StackTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int a=3;
		test t1=new test(3,4);
		t1.fun(1,2);
		
	}

}
class test{
	int ta;
	int tb;
	public test(int ta,int tb) {
		this.ta=ta;
		this.tb=tb;
	}
	public void fun(int f1,int f2) {}
}

堆区结构图:
java学习笔记(三)栈,堆,方法区。
t对象的具体内容:
1、Mark Word:对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。
2、Class对象指针:Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址(class对象就是生成的.class文件,既然是一个对象,他就是存在堆里面的)
3、对象实际数据:这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节
4、对齐:最后一部分是对齐填充的字节,按8个字节填充。
3:方法区
方法区存储的是类的元数据。(我理解的是代码片段)
方法区还可以存储static修饰的变量。
方法区中有字符串常量池。
java学习笔记(三)栈,堆,方法区。

相关文章:

  • 2021-06-25
  • 2021-08-07
  • 2021-11-18
  • 2022-02-25
  • 2021-11-30
  • 2022-01-31
  • 2021-08-11
  • 2022-12-23
猜你喜欢
  • 2021-12-11
  • 2021-11-15
  • 2022-12-23
  • 2022-12-23
  • 2021-11-14
  • 2022-12-23
  • 2022-02-07
相关资源
相似解决方案