Java内存管理(一、内存分配)
关于Java内存分配,很多问题都模模糊糊,不能全面贯通理解。今查阅资料,欲求深入挖掘,彻底理清java内存分配脉络,只因水平有限,没达到预期效果,仅以此文对所研究到之处作以记录,为以后学习提供参考,避免重头再来。
一、Java内存分配
1、 Java有几种存储区域?
* 寄存器
-- 在CPU内部,开发人员不能通过代码来控制寄存器的分配,由编译器来管理
* 栈
-- 在Windows下, 栈是向低地址扩展的数据结构,是一块连续的内存的区域,即栈顶的地址和栈的最大容量是系统预先规定好的。
-- 优点:由系统自动分配,速度较快。
-- 缺点:不够灵活,但程序员是无法控制的。
-- 存放基本数据类型、开发过程中就创建的对象(而不是运行过程中)
* 堆
-- 是向高地址扩展的数据结构,是不连续的内存区域
-- 在堆中,没有堆栈指针,为此也就无法直接从处理器那边获得支持
-- 堆的好处是有很大的灵活性。如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。
* 静态存储区域与常量存储区域
-- 静态存储区用来存放static类型的变量
-- 常量存储区用来存放常量类型(final)类型的值,一般在只读存储器中
* 非RAM存储
-- 如流对象,是要发送到另外一台机器上的
-- 持久化的对象,存放在磁盘上
2、 java内存分配
-- 基础数据类型直接在栈空间分配;
-- 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;
-- 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;
-- 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;
-- 局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收;
-- 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用
相关文档:
Java代码
final TC[] ts = new TC[20];
for (int i = 0; i < ts.length; i++) {
......
package tf;
public class TestPack {
public static void main(String [] args)
{
try
{
IAnimal cAnimal = new bird();
cAnimal.shout();
IAnimal animal =(IAnimal)java.lang.Class ......
附录A: Java编码规范
一、 Java命名的一般性指导
1. 类名首字母应该大写。属性(成员变量)、方法、对象变量以及所有标识符(如形式参
数、实际参数、局部变量)的首字母应小写,其中包含的所有单词都应紧靠在一起,而
且大写中间单词的首字母。
例如:类名:ThisIsAClassName 属性或方法名:thisIsMethodOrFieldName
......
Java Mail无法解析带分号的收件人列表的问题
今天同事碰到一个问题,使用JAVA MAIL收取邮件时,如果收件人是个列表,且收件人列表是以分号进行分割的,则JAVA MAIL就会出现异常,不能正常解析,抽空看了一眼,自己写了个简单demo,很简单,例如:
@Test
public void te ......