JVM----栈,堆,代码,静态存储区的存储顺序和位置

更多了解:https://blog.csdn.net/zhangbaoanhadoop/article/details/82193497

 

栈的特点如下

  1.栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量,引用变量(方法中声明的对象的引用)、操作数、方法出口等)
  2.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3.栈属于线程私有,不能实现线程间的共享!
  4.栈的存储特性是”先进后出,后进先出"(比如线程调用一个方法a,在栈用开辟一块空间存放线程a的所有的变量,方法a中调用方法b,在开辟一块空间存放方法b的所有的变量),如图所示,当方法b执行完毕,存放方法b中栈帧销毁,等方法b执行完毕,方法a执行完毕,方法a的栈帧销毁(体现出了先进后出)

  

  5.栈是由系统自动分配,速度快!栈是一个连续的内存空间

堆的特点如下

1.堆用于存储创建好的对象和数组(数组也是对象)

2.JVM只有一个堆,被所有线程共享(堆中的对象不一定被所有的线程共享)

3.堆是一个不连续的内存空间,分配灵活,速度慢!

 

方法区(又叫静态区)特点如下

1.JVM只有一个方法区,被所有线程共享!
2.方法区实际也是堆,只是用于存储类、常量相关的信息!
3.用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)

 

 

在JDK1.8之前,叫做永久代,jdk1.8之后叫做元空间

永久代和元空间的区别

  元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下元空间的大小仅受本地内存限制,但仍可以通过参数控制:
-XX:MetaspaceSize与-XX:MaxMetaspaceSize来控制大小。

 

 

 

java值传递

对于基本数据类型传递就是值的内容

对于引用类型,传递的是内存地址

public class Demo {
    public static void main(String[] args){
        int a = 1;
        new Demo().test(a);
        System.out.println(a);

        String str = "str";
        new Demo().test1(str);
        System.out.println(str);

        ArrayList<Integer> integers = new ArrayList<>();
        new Demo().test2(integers);
        System.out.println(integers);

        ArrayList<Integer> integers1 = new ArrayList<>();
        new Demo().test3(integers1);
        System.out.println(integers1);
    }
    public void test(int a){
        a++;
    }
    public void test1(String str){
        str = "str"+str;
    }
    public void test2(List<Integer> list){
        list.add(1);
    }
    public void test3(List<Integer> list){
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(2);
        list = integers;
    }
}

传递值是str类型,原因在于string是不可以变的,如果对它进行修改,就会重新创建一个对象

 

posted @ 2019-04-05 10:49  小名的同学  阅读(1224)  评论(0编辑  收藏  举报