(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 ...
随机推荐
- 5.4 Linux 安装2个tomcat
Linux系统下怎样配置多个Tomcat同时运行呢,首先第一个tomcat配置不变,然后修改第二个tomcat启动的脚本 拷贝第一个tomcat的目录到第二个tomcat目录 [root@eshop- ...
- Cadence套件:Capture + Allegro应用笔记
1.在Allegro中导入Netlist时,需要进行封装路径的设定: 在Setup->User Preference的Path->Library下面,设定所需封装文件(psm).焊盘文件( ...
- spring源码第一章_获取源码并将源码转为eclipse工程
1.通过http://gitforwindows.org/下载github 2.通过http://services.gradle.org/distributions/下载gradle:gardle类似 ...
- 请求http协议分析- (mysql-thinkphp) (5)
http协议 https://tools.ietf.org/pdf/rfc7231.pdf https://www.w3.org/Protocols/ ======================== ...
- 51nod 1378:夹克老爷的愤怒 很好玩的一道树状dp
1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 取消关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织 ...
- php+ajax 实现无限树列表
首先介绍我实现的是xhprof插件的日志转为无限树状图,先看效果图: 废话不多说,直接看代码:(辛辛苦苦敲了好久才搞定,逻辑比较多,新手多揣摩) 控制器: 1 <?php 2 3 namespa ...
- python SSTI tornado render模板注入
原理tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传 ...
- oracle通用帮助类
需要的dll( EntityFramework.6.0.0Oracle.ManagedDataAccess.12.1.2400System.Configuration.dllEmitMapper.1. ...
- Linux学习《第五章 用户身份与文件权限》
- Golang的标识符命名规则
Golang的标识符命名规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关键字 1>.Go语言有25个关键字 Go语言的25个关键字如下所示: break,defau ...