方法到底存放在哪个位置呢?
看了很多博客有说方法在方法区里的,还有说方法在堆里的,还有说方法是从方法区加载到堆里的,过程中造成了很堵混淆的地方,个人疏离了一遍,才疏学浅,理解错误请指正。
个人理解:
- Java栈存储的是栈帧,方法的栈帧而非方法;每个方法对应一个栈帧
- 方法区比较容易理解的就是它存放的是类的信息,类的信息自然也就包括类里面的方法信息、字段信息等等,这里容易混淆的是:方法区存放的是类的信息也可以说是模版,套用过去普通的方法信息,也就是方法的模版;所以实际方法存放的位置还是不在这里,这里存放的知识模版
- 堆:关于堆我是看了这么一段理解的
“类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。”
很多博客上都说是把类、方法、常变量放到堆内存,这里又造成一次混淆:类、堆到底在方法区还是在堆;但是结合另一种说法应该就能比较清楚了。
“堆Heap存放的是类的实例”,那么这句话就已经说的很清楚了类加载器加载到堆内存的东西,实际就成了对象实例,那么类里面定义的普通方法,自然也就包含在实例对象里面
结论
栈存放的是方法的栈帧,不是方法
方法区:存放的是方法的信息,相当于方法的模版,被包含在类的信息里,也不是方法
堆:存放的才是实际对象的方法,实例化后的方法