Java内存列表
当jvm运行起来的时候,它会向系统申请一片内存区,并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”。
初学的时候把Java内存分为堆内存和栈内存,这种分法是比较粗糙的。
仔细来看,运行时数据区可以划分成程序计数器(PC寄存器)、本地方法栈、虚拟机栈(Java栈)、堆、方法区、运行时常量池。
程序计数器(PC寄存器):Java是多线程的,每个线程都需要一个独立的程序计数器,以控制程序的分支、循环、跳转、异常处理等基础操作。
虚拟机栈(Java栈):和程序计数器(PC寄存器)一样是线程私有的。每个线程可以有多个方法,而每个方法被执行的时候都会同时创建一个栈帧,用来存储局部变量,操作数栈,动态链接,返回地址(方法出口)等信息。再次注意的是:其中局部变量(各种基本类型的变量和对象的引用变量)只是此栈内存中的一部分。
本地方法栈:与虚拟机栈(Java栈)所发挥的作用相似,区别在于本地方法栈是为虚拟机使用到的Native方法服务。
堆:线程共享。所有的对象实例和数组都在堆上分配。
方法区:线程共享。用于存储已被虚拟机加载的类信息、常量、静态变量等。注意的是:虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它也称作非堆。
运行时常量池:方法区的一部分。存放编译期生成的各种字面量(文本字符串、声明为final的常量值)和符号引用(类和接口的全限定名、字段的名称和描述符、方法的名称和描述符)。
对象池机制:常量池。
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内存模型深度解析:基础部分--转
原文地址:http://www.codeceo.com/article/java-memory-1.html 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何 ...
- Java内存以及GC
<深入理解Java虚拟机>第二三章摘要 Java内存区域与内存溢出 Java虚拟机中的内存分配图: 各个区域的特性总结如下表: 补充说明: 当多线程情形下,可能多个线程要在堆上分配内存,那 ...
- 【转】Java内存管理:深入Java内存区域
转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...
- JAVA内存管理
java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙.墙外面的人想进去,墙里面的人想出去. 1.java内存分布 程序计数器 栈(局部变量.操作数.动态链接.方法出口) 每一个方法从调用 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Java虚拟机2:Java内存区域及对象
几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB,相邻 ...
- java内存模型-基础
基础 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间 ...
- 【深入Java虚拟机】之一:Java内存模型与内存溢出
[深入Java虚拟机]之:Java内存区域与内存溢出 高速缓存模型如下: ----------------------------------------------------分割线-------- ...
- 【Todo】【转载】深入理解Java内存模型
提纲挈领地说一下Java内存模型: 什么是Java内存模型 Java内存模型定义了一种多线程访问Java内存的规范.Java内存模型要完整讲不是这里几句话能说清楚的,我简单总结一下Java内存模型的几 ...
随机推荐
- [HDU6146]Pokémon GO
Problem 有一个2n的方格矩阵 在一个格子上可以往旁边8个方向走(如果有格子),求有多少方案把2n走完 Solution 我们用Fi表示从一个角出发走遍所有格子回到这一列另外一点的方案数 显然, ...
- STL next_permutation 算法原理和实现
转载自:https://www.cnblogs.com/luruiyuan/p/5914909.html 目标 STL中的next_permutation 函数和 prev_permutation 两 ...
- socket练习--ssh
服务器端: # -*-coding:utf-8-*- # Author:sunhao import socket import os server = socket.socket() ip_port ...
- TestLink测试管理工具的使用举例—第一篇
本博客用来详细说明TestLink测试管理工具的使用方法,前两篇博客已经详细说明了TestLink工具的下载,安装及基本登录功能,本篇开始说明其工具的具体使用! 下载安装TestLink工具之后,我们 ...
- vscode下调试运行c++
vscode是微软的最新产品,轻量易用,最初是前端用的多,尤其是typescript,因为vscode的作者也是typescipt作者.一般c++的IDE很多,比如visual studio等,但是都 ...
- winform 下载
方法一: WebClient webClint = new WebClient(); webClint.DownloadFile(下载文件的路径,下载到本地的地址); 方法二:异步 WebClient ...
- React Native Android打包apk
按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...
- Idea Tomcat Servlet路径配置问题
虚拟路径问题没有搞清楚,折腾了好久. 总的来说:login.html(action)和loginServlet(@webServlet)的虚拟路径相差一个/day14.同时二者在浏览器的访问时,都必须 ...
- latex之插入向量、图片、编号
1.向量 $\vec a$\qquad $\overleftarrow{AB}$\qquad $\overleftrightarrow{AB}$\qquad $\overrightarrow{AB}$ ...
- JVM垃圾回收算法解析
JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...