谈谈java内存中的堆、栈、方法区

java栈的区域很小,但是存取速度很快,所以在栈中存放的都是快速执行的任务,基本数据类型的数据和对象引用。

栈指针向下移动创建新的内存,向上移动释放内存

所以,JVM只会对栈执行两种操作:1.以帧为单位的压栈和出栈  2.通过 -Xss来设置栈的大小,若大小不够用则抛出StackOverflowError异常

每个线程都包含一个栈区,每个栈中的数据都是私有的,其他栈不能访问。 栈分为3个部分: 基本数据类型变量区、执行环境上下文、操作指令区

在JVM中的一个进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素被称为栈帧,每当线程调用一个方法的时候就会向方法栈中压入一个新栈帧。
这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据

类的对象存放在堆中,因为堆最吸引人的地方就在于编译器不必知道堆里分配了多少存储空间,也不必知道存储的数据在堆中要停留多长的时间,所以在堆中保存的数据得到了更大的灵活性

堆占内存的大小通过 -Xmx 和-Xms 来调节

方法区

存放所有的类信息  静态变量  静态方法  常量和成员方法

方法区和堆一样,被所有线程共享,因为方法区中存在的是整个程序中永远唯一的元素

方法区大小由 -XX: PermSize 和 -XX :MaxPermSize 来调节 

举例说明

系统收到指令启动一个java虚拟机进程后,这个进程首先会从classpath中找到比如说Main.class文件,读取这个类文件的数据,然后把类信息存储到方法区中,这个过程就是Main这个类的加载过程

然后JVM加载到的   Simple s = new Simple() 这样一条指令,就是要建一个Simple类的实例,然后就会去方法区中找这个类的信息,结果发现没找到,这时候JVM就会加载Simple类,然后吧相关的类信息放进方法区

Simple类加载完之后,jvm就开始为这个新建的实例开始分配内存,对象实例在堆中,对象引用在栈中,局部变量也在栈中,成员方法在方法区中。

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页