Java内存浅析分类
当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),
并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”。
运行时数据区可以划分成PC寄存器,本地方法栈,JAVA栈,堆,方法区。
PC寄存器,本地方法栈可以简单的理解为其是为JVM服务的,这两个区域不需要太多关注。
对程序员来说,经常关注的就是栈,堆(方法区(常量池))。这里并没有显式的指出常量池。原因如下图:

栈:即虚拟机栈。每个方法被执行的时候都会同时创建一个栈帧,用来存储局部变量,操作栈,动态链接,方法出口等信息。
重点关注的原因是:其中局部变量(各种基本类型的变量和对象的引用变量)都是在此栈内存中。
堆:堆内存,在虚拟机启动时创建。堆内存的唯一目的就是创建对象实例,所有的对象实例和数组都要在堆上分配。
方法区(静态区):可以理解是堆内存上的一部分,特殊的原因是它被叫做“非堆”。用于存放已被虚拟机加载的类信息、常量、静态变量。
垃圾回收在这个区域出现的几率少,但并不是不进行回收。
常量池:运行时常量池,存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放在方法区的运行时常量池中。
需要注意的是常量池内的数据也有会被进行垃圾回首。比如没有被引用的时候。
对象池机制:常量池。
String str1 = "abc";
String str2 = "abc";
创建了一个对象,原因是:在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。
由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。
字符串池由String类维护,我们可以调用intern()方法来访问字符串池。
我们再回头看看String str1="abc";这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,
它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;
如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,是创建了一个对象。
关于基本类型以及提供其包装类提供的方法这里就不一一表述了。记得自动装箱和拆箱是JDK1.5的时候提出的。
同时需要注意的是包装类中提供的和String相互转化的方法以及包装类之间转化的方法,这个需要练习。
这里只讲解:byte i = "128";中128这个数值存放在内存的哪里。
Character a = 127;
Character b = 127;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println("------------------------------------");
Character a1 = 128;
Character b1 = 128;
System.out.println(a1 == b1);
System.out.println(a1.equals(b1));
System.out.println("------------------------------------");
char a2 = 127;
char b2 = 127;
System.out.println(a2 == b2);
输出:
true
true
------------------------------------
false
true
------------------------------------
true
解释:Java为了提高性能提供了对象池机制,和String类一样,Java的八种基本类型的包装类中的六种也有对象池机制。
这六种包装类是:Byte,Short,Integer,Long,Character,Boolean。不同的是,这六种基本类型的包装类使用对象池的前提是数值要大于127。
Java内存浅析分类的更多相关文章
- [转载]Java 内存分配全面浅析
Java 内存分配全面浅析 2013-02-20 17:54:45 袭烽 阅读数 91353更多 分类专栏: java基础 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Ja ...
- Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- Java内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- Java内存分配全面浅析(转)
原文引自CSDN: 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个 ...
- 【转载】Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
- Java 内存模型 JMM 浅析
JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体平台的统一的保证.(可能在术语上与Java ...
- Java 内存分配全面浅析(转)
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- 01 Java 内存分配全面浅析
http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...
随机推荐
- 详解SVN 的使用
一.什么是SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 二.SVN的下载安装 下载地址:http ...
- svm损失函数
作者:杜客链接:https://zhuanlan.zhihu.com/p/20945670来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. SVM的损失函数定义如下: 举 ...
- Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1. ...
- android中加载的html获取的宽高不正确
wap页面使用 js库是zepto,按照惯例在$(function(){})中,来获取当前可视区的宽高,但得到的宽高却与预想的相差十万八千里. 原本android手机的浏览器设定的宽高基本是360*6 ...
- 初识Linux-2
1,rm leo/a*可以将leo文件夹中带有a的所有的文件都删除,rm-r leo/a*可以将文件夹中含有a的文件和文件夹都全部删除 2,ls -l -d dc/*2表示遇到含有2的目录时不进入目录 ...
- cpp项目的组织
编译篇 较大型cpp项目的代码组织.编译都是深耦合的. 一般提供一个总体的makefile,进入各个模块,又有自己的makefile,这些makefile又都依赖于一些被include的文件的的定义, ...
- java_SE(Day15)_集合1
一.集合类概述: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象 ...
- Ogre中OIS的输入的使用
OIS的使用有两种模式:缓冲模式和非缓冲模式.非缓冲方式能处理鼠标或键盘长按的事件,实时性强缓冲方式则不能长按事件,用于非实时响应. 非缓冲输入:1.创建方式:其中 false 参数代表使用非缓冲模式 ...
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- 第一次在linux上登录博客
这是我第一次在linux操作系统上登录博客,额,虽然是在X-window上面.好吧,是我太激动了. 这意味着我已经步入linux的世界了,虽然中文输入法不太好用,但是我还是写一下我的心情吧. 从去年的 ...