对Java中堆栈的解析
Java把内存分为两种:一种是栈内存,一种是堆内存
栈内存:在函数中定义的一些基本类型的变量和对象的引用变量,当超过变量的作用域之后,Java自动释放该变量内存
堆内存:存放new创建的对象和数组,由JVM的GC(Java虚拟机的自动垃圾回收器)管理
附加1:跟C++不一样,Java自动管理栈和堆
栈的 优势:存取速度快,栈数据可以共享(具体参考附加2)
缺点:存在栈中的数据大小跟生存周期必须是确定的,不灵活
堆的 优势:动态的分配内存,不必有个确定的数值,GC会自动回收垃圾数据
缺点:存取速度慢
附加2:为什么栈的数据可以共享?
执行int a = 3,int b =3,先在栈中创建一个变量为a的引用,然后在栈中找有没有字面值为3的地址,如果没有,就开辟一个存放字面值为3的地址,如果有就将引用变量a指向字面值为3的这个地址,现在执行完了int a = 3,之后,栈中有一个引用变量a和一个字面值为3的地址,且引用变量a指向字面值为3的地址,然后执行int b = 3,创建一个引用变量b,然后找字面值为3的地址,因为前面创建了,所以可以找到,所以让引用变量值指向字面值为3的地址,所以引用变量a和b都指向同一个字面值为3的地址,达到了数据共享的目的
Java中的数据类型:
有两种,第一种是基本的数据类型,8种即:int,short,long,byte,float,double,boolean,char(注意注意!没有String类型),大小可知,所以存于栈中,第二种是包装类的数据,如Integer,String,Doubel,目的是方便数据类型的转换,存于堆中
public static void main(String[] args) {
String a = "123";
int b = Integer.valueOf(a);//包装类存在的目的是为了方便进行数据类型的转换
System.out.println(b+1);
}
对特殊包装类String的分析:
先分析String str = "abc"的内部工作
1.定义一个叫做str的String类型的对象引用变量
2.在栈中查找有没有存放值为"abc"的地址,如果没有,就开辟一个存放值为"abc"的地址,接着在堆中创建一个新的String类对象o,且将o的字符串值指向这个地址,在栈中这个地址的旁边记下引用对象o,如果已经有了值为"abc"的地址,则查找对象o,返回o的地址
3.将str这个对象引用变量指向对象o的地址
4.结束
对String str = "abc"的正确解释:定义了一个引用变量指向"abc"这个String类型的对象
这种情况下,其在堆中对象的字符串值指向栈中的引用,即字符串值指向引用
String str1 = "abc"; String str2 = "abc";
System.out.println(str1==str2); //true //“==”在JDK中只有两个引用都指向了同一个对象才返回真
说明两个不同的引用变量都指向了同一个对象
进一步说明:
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
System.out.println(str1 + "," + str2); //bcd, abc
System.out.println(str1==str2); //false
赋值的变化导致了对象的变化,str1指向了一个新的对象,而str2还是指向一个原来的对象
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
分析:俩个不同的引用,指向两个不同的对象,说明new在堆中创建的对像,不会共享栈中的数据
附加3:String和String Buffer和String Builder的优缺,区别
String:长度大小不可变,当字符串需要经常变化的时候,不要使用,会降低程序速度
String Buffer和String Builder:长度可变
String Buffer:线程安全,多线程的时候建议使用
String Builder:线程不安全,比String Buffer速度快,单线程的时候建议使用
附加4:什么叫做线程不安全?
即多线程运行的时候出现的数据不一致型,举一个非常生动形象的例子,线程安全也可以说是同步,同步就是说要等前面的请求完后,后面的才可以操作
线程不安全可以说是异步,异步不用等待前面的请求,从效率上说,异步比同步快NN倍 ,摘自:http://bbs.csdn.net/topics/350181982
/////
打个比方,你和你老婆共用一张银行卡。忽然有一天,你去银行取钱,先查了一下余额有2000块钱,你想想取1500吧。刚巧这时候你老婆在网上看上一件800块钱的衣服,趁这功夫买下来了。你不知道钱被扣掉了,于是怎么都取不出来这1500。
线程同步也是这个意思,当多线程运行时,他们可能会调用同样的资源,他们之间也不会互相通气,如果不采取措施,就有可能导致上面的问题。线程不是人,他取不到钱的时候不会就这么走了,要么死等导致deadlock,要么直接崩溃。线程安全就是要实现多线程时运行的结果和单线程时一样。明白了么?
///////////////////
总结就是多线程运行的时候他们可能调用相同的资源,但是他们互不通气,各自干各自的,就叫线程不安全
Java中内存分配策略
3种:静态的,栈式的,堆式的
静态内存分配策略:要求代码中不允许有可变的数据结构,比如可变数组,不允许嵌套递归
栈式内存分配策略:又叫动态分配,在编译时对数据趣的需求是未知的,只有运行的时候才知道,但是在程序的入口必须告诉程序,这样才能确定程序块的需求内存大小来进行分配
堆式内存分配策略:负责在编译时或者程序的入口时都无法确定储存要求的内存分配,比如对象实例和可变的字符串,堆由大片的可利用块或者空闲块组成,可以按照任意顺序分配和释放内存
java中对象的内存分配:
Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分 配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存
只是一个指向这个堆对象的引用而已
相关资料:http://blog.csdn.net/wulianghuan/article/details/8602254
对Java中堆栈的解析的更多相关文章
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
- JAVA中生成、解析二维码图片的方法
JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- JAVA中堆栈和内存分配原理
1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...
- java中堆栈(stack)和堆(heap)
原文地址:http://blog.csdn.net/jerryao/article/details/874101 1.内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈 ...
- JAVA中堆栈和内存分配
(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或 ...
随机推荐
- ASP.NET Core 认证与授权[7]:动态授权
ASP.NET Core 中基于策略的授权旨在分离授权与应用程序逻辑,它提供了灵活的策略定义模型,在一些权限固定的系统中,使用起来非常方便.但是,当要授权的资源无法预先确定,或需要将权限控制到每一个具 ...
- "MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "解决方法
写Code First 时(使用的是MySql数据库),添加好EntityFrame.MySql.Data .MySql.Data.Entity后 ,写好TestDbContext类. 运行时报出一个 ...
- 《java.util.concurrent 包源码阅读》25 Fork/Join框架之Fork与Work-Stealing(重写23,24)
在写前面两篇文章23和24的时候自己有很多细节搞得不是很明白,这篇文章把Fork和Work-Stealing相关的源代码重新梳理一下. 首先来看一些线程池定义的成员变量: 关于scanGuard: v ...
- python学习笔记 list
1.list中的任一元素可以是任一类型.可以是混合的,如,前两个字符串后面的是数字.都是可以的. 2.可以用-1表示最后一个元素. 3.注意不要越界. 4.len(mates) 用来计算list的大小 ...
- 裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- android扫描网页二维码进行网页登录
转载请标明出处: http://www.cnblogs.com/dingxiansen/: 本文出自:丁先森-博客园 周六和朋友去网吧开黑,开机打开TGP,朋友那边开始输入账号密码,我看了他一眼low ...
- Android APP 性能优化的一些思考
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- 随机生成N个字符(包含数字和字母)
'************************************************************* ' Name: GetRandomString ' Purpose: 随机 ...
- 计算机网络初探(ip协议)
粗读了两遍计算机网络(谢希仁),对于计算计算机网络算是有了一个初步的了解,所以打算写一篇文章(希望是教程)进行巩固(主要围绕IP协议). 局域网 因特网的产生和广泛使用极大地改变了我们的生活,但对于不 ...
- Java分布式锁实现详解
在进行大型网站技术架构设计以及业务实现的过程中,多少都会遇到需要使用分布式锁的情况.那么问题也就接踵而至,哪种分布式锁更适合我们的项目? 下面就这个问题,我做了一些分析: 分布式锁现状: 目前几乎很多 ...