引子

一段简单的代码结果引发疑问,==到底比较的是什么?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堆中

一、虚拟机栈

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

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

二、程序计数器

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

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

三、本地方法栈

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

四、堆

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

五、方法区

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

内存区域特点

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

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

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

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

(1) JVM内存管理:内存模型的更多相关文章

  1. 【原创】android内存管理-内存泄漏原因

    转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5704596.html 先讲一下内存泄漏的概念:内存泄露是指无用对象持续占有内存,或者内存得不到及时 ...

  2. Java中的垃圾回收机制&内存管理&内存泄漏

    1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...

  3. Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件

    1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...

  4. 内存管理 & 内存优化技巧 浅析

    内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...

  5. 构造函数,C++内存管理,内存泄漏定位

    构造函数 1.构造顺序 虚基类构造函数,基类构造函数,类对象构造函数,自己的构造函数 2.必须使用初始化列表 (1) 引用成员,常量成员: (2) 基类没默认构造函数(自己重载覆盖了), (3)类对象 ...

  6. Linux内核内存管理-内存访问与缺页中断【转】

    转自:https://yq.aliyun.com/articles/5865 摘要: 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存 ...

  7. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  8. JVM内存管理概述

    1.概述 java不在需要开发人员显示的分配内存和回收内存,而是由JVM自动管理内存的分配和回收(又称为垃圾回收-GC),这简化了编程难度,但同时可能使得程序员在不知不觉中浪费了很多内存,导致JVM花 ...

  9. JVM内存管理之JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  10. java 内存管理 —— 《Hotspot内存管理白皮书》

    说明   要学习Java或者任意一门技术,我觉得最好的是从官网的资料开始学习.官网所给出的资料总是最权威最知道来龙去脉的.而Java中间,垃圾回收与内存管理是Java中非常重要的一部分.<Hot ...

随机推荐

  1. 被动信息收集-其他收集目标信息的途径:cupp、 recon-ng

    除了google等搜索收集,还有其他途径进行信息收集,其中就包括用命令行或集成的软件.框架进行搜集信息. 1.先举例几个简单的命令: 其实也会是调用搜索引擎,如谷歌必应等,需要翻墙,可以用proxyc ...

  2. 厉害了!SpringBoot是如何动起来的!

    程序入口 SpringApplication.run(BeautyApplication.class, args); 执行此方法来加载整个SpringBoot的环境. 1. 从哪儿开始? Spring ...

  3. 线程与FORK

    1.线程锁的问题 需要调用进程线程锁处理函数 prefork-----获取父亲进程锁----在fork掉用之前,目的是为了在子进程中获取到可释放的锁 parentfork----释放父亲进程锁 chi ...

  4. 关于页面跳转之后获取不到session数据的问题

    暂时的解决方法有两种,亲测有效: 方法一:  将页面跳转方式由a标签改为请求转发request.getRequestDispatcher("stu_list.jsp").forwa ...

  5. Html5 -- 语义标签兼容性处理

    方法一:通过js处理 方法二:完美的处理方式 no.1 !--[if lte IE 8]> <script type="text/javascript" src=&qu ...

  6. JavaScript 字符编码

    JavaScript 字符编码 JavaScript 遵循 Unicode 字符编码规则.Unicode 字符集中每个字符使用 2 个字节来表示,这意味着用户可以使用中文来命名 Java)Script ...

  7. 洛谷 P4391 [BOI2009]Radio Transmission 无线传输

    题目传送门 解题思路: 本题所要求的循环节,其实就是最长公共前缀的前缀长度减去前后缀重叠的一部分 AC代码: #include<iostream> #include<cstdio&g ...

  8. Java笔记--集合

    1.Java集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组. 2.Java集合可分为Collection和Map两种体系: --Collection:1)Set:元素无序. ...

  9. C++中数字与字符串之间的转换 scanf string总结(复习必读)

    1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...

  10. 真香的flex弹性布局

    如何实现一个左中右的布局 在flex出现之前 #box{ color: white; } #left{ float: left; width: 30%; background-color: red; ...