方法在执行过程中 JVM分配,内存变化?
方法只定义没有调用的话,是不会执行的,并且在JVM中也不会分配运行所属的内存空间,只有在调用时候,才会 动态 的给他分配空间
JVM内存划分
方法区内存
堆内存
栈内存
栈的数据结构
栈stack是一种数据结构,数据结构反映的事数据的存储形态
数据结构是独立的学科,不属于任何编程语言的范畴,只不过大多数语言需要数据结构。
常见的数据结构:
数组 |
---|
队列 |
栈 |
链表 |
二叉树 |
哈希表/散列表 |
… |
栈执行方式:
方法代码片段存在哪里?内存分配
方法代码段属于xxx.class字节码文件的一部分,在进行类加载时将其放入方法区内存中,所以jvm三块空间中方法区最优先有数据 存放代码片段。
代码片段虽然是方法区的一部分,但是可以重复调用,每一次调用这个方法是,都需要给他分配一个独立的活动场所 这个场所在栈内存中分配
方法在分配的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束后,会给方法分配的内存空间全部释放,叫做弹栈。
压栈:给方法分配内存
弹栈:释放分配的内存空间
局部变量在方法体中声明,局部变量在运行阶段内存在栈中分配
方法调用时候 传的是值 不是局部变量 他不能直接操作其他类中的变量
栈内存存储的主要是局部变量
三块内存空间中 最频繁使用的是栈内存 最先使用的是方法区内存
垃圾回收机制主要针对堆内存。
什么时候堆内存数据会变成垃圾?
当堆内存中的java对象变成垃圾数据时候
没有更多的引用指向它时候
这个对象无法访问时候 因为这个对象只能通过引用使用。
JVM执行过程
JVM执行过程
方法体先进入方法区内存,然后开始执行,main开始,内存分配,压入栈,然后运行到m方法,再次分配空间,压栈,执行结束 弹栈,后入先出原则,先弹出m方法 最后弹出main方法。释放空间。