当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内存浅析分类的更多相关文章

  1. [转载]Java 内存分配全面浅析

    Java 内存分配全面浅析 2013-02-20 17:54:45 袭烽 阅读数 91353更多 分类专栏: java基础   本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Ja ...

  2. Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  3. Java内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  4. Java内存分配全面浅析(转)

           原文引自CSDN:        本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个 ...

  5. 【转载】Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...

  6. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...

  7. Java 内存模型 JMM 浅析

    JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体平台的统一的保证.(可能在术语上与Java ...

  8. Java 内存分配全面浅析(转)

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  9. 01 Java 内存分配全面浅析

    http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析  本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...

随机推荐

  1. CSS3的calc()使用

    CSS3的calc()使用 calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pad ...

  2. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  3. iOS测试常见崩溃

    什么是崩溃日志,从哪里能得它? iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上.崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的.通常,上面有每个正在执行线程的 ...

  4. Android深度探索HAL和驱动开发(卷1) 第一章 Android系统移植和驱动开发

    由于Android是基于Linux内核的,因此,Android和其他Linux系统的核心部分差异非常小.然而不同版本的Android使用的Linux内核的版本有细微的差异,所以不同Android驱动可 ...

  5. oracle数据迁移、备份等

    exp db  或者数据泵. 或者ETL工具

  6. ✡ leetcode 173. Binary Search Tree Iterator 设计迭代器(搜索树)--------- java

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  7. C语言字符串处理函数

    函数名: strcpy  功  能: 拷贝一个字符串到另一个  用  法: char *stpcpy(char *destin, char *source);  程序例:  #include < ...

  8. 学C日志

    学C历程 这里记录的都是笔记 忘记了好回头看看~ 提示 :如果在双击自己编译的程序运行时一下就消失不见了 可以在程序代码末尾加上 system("pause"); 程序就会等待到输 ...

  9. 表单和 HTML 辅助方法– ASP.NET MVC 4 系列

           这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...

  10. 利用C语言获得网页编码

    #include <stdio.h> #include <winsock.h> #include <string.h> #pragma comment(lib, & ...