怎么理解栈、堆?堆中存什么?栈中存什么?
栈是运行时的单位,而堆是存储的单位。
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。
为什么不把基本类型放堆中呢?
因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了。
可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。
如何设置堆栈的大小?
java -Xmx512m -Xmx512m … //-Xmx 设置堆最大值 , -Xms设置堆初始值。
-Xss 2m 设置栈的大小。
一个空Object对象的占多大空间?
new一个Object对象占用8+16=24字节(64位JDK),8个字节的引用和16字节的堆内存占用
new一个Object对象占用4+8=12字节(32位JDK),4个字节的引用和8字节的堆内存占用
java 对象的结构?
参考原文地址
为什么 java 对象按照8字节的倍数分配?
其目的是 数据对齐(alignment),它允许以一些空间为代价加快内存访问。如果数据未对齐,则处理器需要在加载内存后进行一些转换才能访问它。
此外,垃圾回收简化(并加快)最小分配单元的大小。
Java不需要8字节(64位系统除外),但由于32位体系结构是创建Java时的常态,因此Java标准中可能需要4字节对齐。
Java中对象的引用?
强引用
弱引用
软引用
虚引用