zoukankan      html  css  js  c++  java
  • (1) JVM内存管理:内存模型

    引子

    一段简单的代码结果引发疑问,==到底比较的是什么?equals呢?

    public static void main(String args[]){
    String s1="abc";
    String s2="abc";
    System.out.println(s1==s2);
    System.out.println(s1.equals(s2));

    String s3=new String("abc");
    System.out.println(s1==s3);
    System.out.println(s1.equals(s3));
    }


    运行结果是:

    true

    true

    false

    true

    如果等号比较的是引用的内容,那么s1==s3的结果并非预期的那样;如果等号单纯比较引用是否相等,为什么s1==s2?

    解释

    1)等号确实比较的只是单纯的引用是不是相等的;也就是这两个引用指向的是不是同一个地址

    2)equals类型仅用于类,它比较的是类中的内容是否相等

    String类型是最简单,最适合举例的类

    我们可以明白,s1,s2指向的同一个地方,但s1和s3是不同地方

    JVM内存模型

    事实上,所有的int a=3; String a="abc";它们的对象(姑且理解成内容或者值)都被存在了一个叫运行时常量池的地方

    这个地方的好处就是每当存储变量时,会检测运行时常量池中是否有和它相等的变量;如果有,就把引用直接指向那个变量

    所以上面例子中的s1和s2,是指向运行时常量池的同一块

    那么s3呢?这时它完全按照类的模式初始化,所以它的值也被存在了Java堆中

    JVM内存模型

    一、虚拟机栈

    类似于Windows中的栈,每个线程都有自己独享的栈,用来存放运行时局部所需要的东西

    String s3=new String("abc"); 其中的s3这个引用,被存在了虚拟机栈中

    二、程序计数器

    记录JVM将要运行的下一条指令(字节码形式)的地址

    Java编译的时候首先生成.java文件,也就是字节码形式

    三、本地方法栈

    在java程序运行C语言函数时会用到

    四、堆

    所有非静态对象都在此分配并保存;这个区域是所有线程公有的

    五、方法区

    所有的静态变量都保存在这里和运行时需要的常量——简单数据类型和inal类型的一些数据——运行时常量池

    内存区域特点

    1)虚拟机栈、本地方法栈、程序计数器都是线程独有的;堆和方法区是所有线程公有的

    2)JVM在做垃圾回收的时候只针对堆;方法区是从来不动的,所以又称作永久代

    3)而垃圾回收时会将堆分成两部分;年轻代和年老代

    4)除了程序计数器,其他四块都会OutofMemory

  • 相关阅读:
    软件配置管理的作用?软件配置包括什么?
    火火恍恍惚惚
    什么是软件测试?软件测试的目的与原则
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    numpy的broadcast是怎么做的
    python到底是解释型语言还是需要编译的?
    python:删除类实例,仅仅只有动态属性会被删除,类属性不会被删除
    jupyter的kernel莫名其妙找不到,莫名其妙就中断
  • 原文地址:https://www.cnblogs.com/Plorde/p/12302226.html
Copyright © 2011-2022 走看看