(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堆中

一、虚拟机栈
类似于Windows中的栈,每个线程都有自己独享的栈,用来存放运行时局部所需要的东西
String s3=new String("abc"); 其中的s3这个引用,被存在了虚拟机栈中
二、程序计数器
记录JVM将要运行的下一条指令(字节码形式)的地址
Java编译的时候首先生成.java文件,也就是字节码形式
三、本地方法栈
在java程序运行C语言函数时会用到
四、堆
所有非静态对象都在此分配并保存;这个区域是所有线程公有的
五、方法区
所有的静态变量都保存在这里和运行时需要的常量——简单数据类型和inal类型的一些数据——运行时常量池
内存区域特点
1)虚拟机栈、本地方法栈、程序计数器都是线程独有的;堆和方法区是所有线程公有的
2)JVM在做垃圾回收的时候只针对堆;方法区是从来不动的,所以又称作永久代
3)而垃圾回收时会将堆分成两部分;年轻代和年老代
4)除了程序计数器,其他四块都会OutofMemory
(1) JVM内存管理:内存模型的更多相关文章
- 【原创】android内存管理-内存泄漏原因
转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5704596.html 先讲一下内存泄漏的概念:内存泄露是指无用对象持续占有内存,或者内存得不到及时 ...
- Java中的垃圾回收机制&内存管理&内存泄漏
1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...
- Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件
1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...
- 内存管理 & 内存优化技巧 浅析
内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...
- 构造函数,C++内存管理,内存泄漏定位
构造函数 1.构造顺序 虚基类构造函数,基类构造函数,类对象构造函数,自己的构造函数 2.必须使用初始化列表 (1) 引用成员,常量成员: (2) 基类没默认构造函数(自己重载覆盖了), (3)类对象 ...
- Linux内核内存管理-内存访问与缺页中断【转】
转自:https://yq.aliyun.com/articles/5865 摘要: 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存 ...
- JVM内存管理------JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- JVM内存管理概述
1.概述 java不在需要开发人员显示的分配内存和回收内存,而是由JVM自动管理内存的分配和回收(又称为垃圾回收-GC),这简化了编程难度,但同时可能使得程序员在不知不觉中浪费了很多内存,导致JVM花 ...
- JVM内存管理之JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- java 内存管理 —— 《Hotspot内存管理白皮书》
说明 要学习Java或者任意一门技术,我觉得最好的是从官网的资料开始学习.官网所给出的资料总是最权威最知道来龙去脉的.而Java中间,垃圾回收与内存管理是Java中非常重要的一部分.<Hot ...
随机推荐
- Linux 安装 go 以及 arm linux 移植 go
背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...
- 阿里云安装mysql,初始化密码修改
阿里云服务器,centos7, rpm包安装MySQL,初始化了个奇葩密码 登陆不上, 修改配置文件/etc/my.cnf,在[mysqld]下面添加一行代码:skip-grant-tables se ...
- ROS常用库(五)navigation之Tutorials
一.TF 详见古月居 https://www.guyuehome.com/355 重点:广播TF,订阅,编译时Cmakelist添加编译选项 broadcaster.sendTransform( tf ...
- java实现下划线转驼峰
废话少说,直接上代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Temp { publi ...
- Linux基础命令、软件安装
常用命令 查看当前系统中存在哪些shell cat /etc/shells [root@** ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /us ...
- /etc/fstab 只读无法修改的解决办法
在做saltstack的时候不小心误把/etc/fstab给注释了 在命令补全的时候开始报错:[root@kafka2 ~]# cat /et-bash: cannot create temp fil ...
- 052、Java中使用do…while循环实现1~100的累加
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 【LOJ6498】「雅礼集训 2018 Day2」农民
题面 solution 直接暴力模拟,原数据可获得满分的成绩. 对于每个点,其父亲对其都有一个限制.故我们只需要判断当前点到根的路径上的限制是否都能满足即可. 考虑用树剖+线段树维护这个限制.考虑到翻 ...
- NoSql相关
1 NoSQL, No Problem: An Intro to NoSQL Databases https://www.thoughtworks.com/insights/blog/nosql-n ...
- Golang的选择结构-switch语句
Golang的选择结构-switch语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选择语句应用场景概述 选择结构也称为条件判断,生活中关于判断的场景也非常的多,比如: ( ...