Java虚拟机的内存可以分三个区域:栈(stack)、堆(heap)、方法区(method area)。
虚拟机栈的特点:
1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。
2.JVM为每个线程创建一个栈,用于存储该线程执行方法的信息(实际参数、局部变量等)。
3.栈属于线程私有,不能实现线程间的共享。
4.栈的存储特性是“先进后出,后进先出”。
5.栈是由系统自动分配,速度快。栈是一个连续的内存空间。
堆的特点如下:
1.堆用于存储创建好的对象和数组(数组也是对象).
2.JVM只有一个堆,被所有线程共享。
3.堆是一个不连续的内存空间,分配灵活,速度慢。
4.堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。
方法区(也是堆)的特点如下:
1.方法区是Java虚拟机规范,可以有不同的实现。
i.JDK7以前是“永久代”
ii.JDK7部分去除“永久代”,静态变量、字符串常量池都到了堆内存中
ii.JDK8是“元数据空间”和堆结合起来。
2.JVM只有一个方法区,被所有线程共享。
3.方法区实际也是堆,只是用于存储类、常量相关的信息。
4.用来存放程序中永远是不变或唯一的内容。(类信息、静态变量、字符串常量等)。
5.常量池主要存放常量:如文本字符串、final常量值。
参数传值机制:
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。
基本数据类型参数的传值:传递的是值的副本,副本改变不会影响原件。
引用类型参数的传值:传递的是值的副本,但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址的对象的值”,意味着原参数指向对象的值也发生了改变。