java 中的包括以下几大种的内存区域:1.寄存器    2.stack(栈)  3.heap(堆)  4.数据段  5.常量池

那么相应的内存区域中又存放什么东西(主要介绍 stack heap)?

栈:1.基本数据类型的值(4类8种); 2.类的实例(堆区对象的引用) 3.局部变量和形参 4.return xx;会在stack中存在一个临时内存

堆:1.new出来的对象 2.类的对象拥有的成员变量,但是他们存储在各自的堆中。类的成员变量在不通对象中各不相同,都有自己的存储空间。

栈(stack)与堆(heap)优劣势:

1. stack内存存储容量较小,但是存取速度比heap快很多!

存储在栈中的数据大小跟生命周期必须确定,失去机动性。但是stack中的数据具有共享性!

理解stack的共享性:

int a=3; a是基本类型变量,存储在stack中,占有一块空间,空间名称是a,里面的值是3;

此时定义 int b=3;b也存储在stack中,但是不会占用stack的内存空间,因为编译器会先查找在stack中是否存在值为3的空间地址,若存在,则3还有另一个空间名称即 b。

读到这里可能会有一个问题: 假如我把a进行重新赋值,a=4,这时候b=4? 理所当然不不会!!!

因为当对a=4时,编译器会在stack重新查找有没有存在值为4的空间地址,如果没有则会在stack重新开辟地址为4的空间。b此时还是保持不变,占用没有a所开辟的空间地址!

2. heap内存存储容量较大, 堆可以动态的分配内存,跟C++中差不多,但是C++中的内存是手动释放,而jVM中存在垃圾收集器会自动收走这些不在引用的数据。由于要运行new,所以存取速度低于stack!

下面代码:

 package com.Demo;

 class BirthDate {
private int day;
private int month;
private int year; public void setDay(int day) {
this.day = day;
} public void disPlay() {
System.out.println("Year "+ year +"month "+month+"Day "+day);
} public BirthDate(int _day,int _month,int _year) {
day=_day;
month=_month;
year=_year;
}
} public class test { public void change1(int i) {
i=1234;
} public void change2(BirthDate b) {
b=new BirthDate(22,2,2004);
} public void change3(BirthDate b) {
b.setDay(22);
} /*
* 详细分析内存 程序执行的过程
*/
public static void main(String[] args){
test t=new test();
int date=9;
BirthDate b1=new BirthDate(30,12,1995);
BirthDate b2=new BirthDate(23,8,1996);
t.change1(date);
t.change2(b1);
t.change3(b2);
} }

程序在内存中的运行过程:

马老师说过:弄清楚了内存就弄清了一切!

java 内存深度解析的更多相关文章

  1. JAVA内存溢出解析(转)

    JAVA内存溢出解析(转) 核心提示:原因有很多种,比如: 1.数据量过于庞大:死循环 :静态变量和静态方法过多:递归:无法确定是否被引用的对象: 2.虚拟机不回收内存(内存泄漏): 说白了就是程序运 ...

  2. ES 内存深度解析

    注: 本文主要针对ES 2.x. “该给ES分配多少内存?”  “JVM参数如何优化?“ “为何我的Heap占用这么高?” “为何经常有某个field的数据量超出内存限制的异常?“ “为何感觉上没多少 ...

  3. Java内存泄漏解析!

    前言: 内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存.但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏. 本章会说明什么是内存泄漏,为 ...

  4. Java ThreadLocal深度解析

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各 ...

  5. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  6. 【转】java内存分配和String类型的深度解析

    一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...

  7. Java内存模型深度解析:final--转

    原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...

  8. Java内存模型深度解析:volatile--转

    原文地址:http://www.codeceo.com/article/java-memory-4.html Volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特 ...

  9. Java内存模型深度解析:顺序一致性--转

    原文地址:http://www.codeceo.com/article/java-memory-3.html 数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据 ...

随机推荐

  1. python使用paramiko自动化部署linux程序

    使用paramiko模块,比os模块和command模块更加的兼容各种环境.后面两个只能在服务器本机 执行,此模块写得python文件无论是在本地还是服务器本身上运行,都能兼容. paramiko模块 ...

  2. Apache双机热备

    部署方案 1.1 方案设计 1.2 方案描述 如上图所示,我们要有三个可用的IP地址(切记不能与网络中其他机器IP重复),针对我使用的三个IP地址做如下说明: 10.16.252.10 //这个IP地 ...

  3. 5 -- Hibernate的基本用法 --4 3 JDBC连接属性

    Hibernate需要进行数据库访问,因此必须设置连接数据库的相关属性.所有Hibernate属性的名字和语义都在org.hibernate.cfg.Environment中定义. 关于JDBC连接配 ...

  4. Eclipse cdt解决github导入的项目无法打开声明的bug (cannot open declaration)

    概述: 我利用eclipse 的git插件clone github上的远程项目(C++)到本地时遇到一个问题:clone下来的项目没有C++特性,无法使用open declaration等操作,下面是 ...

  5. Go之单元测试

    go单元测试需要按照gotest的规范来编写: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头 3.方法参数必须 t *testing.T   在运行gotest的时 ...

  6. mongodb安装使用笔记

    mongodb安装使用 安装后配置环境变量 创建数据库文件夹并连接数据库,并执行mongod --dbpath c:\workname 打开新的cmd,执行mongo命令,管理数据库 show dbs ...

  7. C#中的Abstract、Virtual、Interface理解

    容易混淆是必须的,都是与继承有关系,并且涉及到override的使用 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中 ...

  8. TCP三次握手原则

    “已失效的连接请求报文段”的产生在这样一种情况下: client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server. 本来这是一 ...

  9. Unity Shader 获取模型空间坐标

    CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma ...

  10. ListView实现多种item布局的方法和注意事项

    这篇文章的效果也是大家常见的,各种通讯应用的对话列表都是这种方式,像微信.whatsapp.易信.米聊等.我们这篇文章也权当为回忆,形成简单的笔记.这篇文章参考了2009年Google IO中的< ...