Java虚拟机内存模型概念

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中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。

        基本数据类型参数的传值:传递的是值的副本,副本改变不会影响原件。

        引用类型参数的传值:传递的是值的副本,但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址的对象的值”,意味着原参数指向对象的值也发生了改变。

你可能感兴趣的:(java,开发语言)