Java内存管理(一、内存分配)
关于Java内存分配,很多问题都模模糊糊,不能全面贯通理解。今查阅资料,欲求深入挖掘,彻底理清java内存分配脉络,只因水平有限,没达到预期效果,仅以此文对所研究到之处作以记录,为以后学习提供参考,避免重头再来。
一、Java内存分配
1、 Java有几种存储区域?
* 寄存器
-- 在CPU内部,开发人员不能通过代码来控制寄存器的分配,由编译器来管理
* 栈
-- 在Windows下, 栈是向低地址扩展的数据结构,是一块连续的内存的区域,即栈顶的地址和栈的最大容量是系统预先规定好的。
-- 优点:由系统自动分配,速度较快。
-- 缺点:不够灵活,但程序员是无法控制的。
-- 存放基本数据类型、开发过程中就创建的对象(而不是运行过程中)
* 堆
-- 是向高地址扩展的数据结构,是不连续的内存区域
-- 在堆中,没有堆栈指针,为此也就无法直接从处理器那边获得支持
-- 堆的好处是有很大的灵活性。如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。
* 静态存储区域与常量存储区域
-- 静态存储区用来存放static类型的变量
-- 常量存储区用来存放常量类型(final)类型的值,一般在只读存储器中
* 非RAM存储
-- 如流对象,是要发送到另外一台机器上的
-- 持久化的对象,存放在磁盘上
2、 java内存分配
-- 基础数据类型直接在栈空间分配;
-- 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;
-- 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;
-- 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;
-- 局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收;
-- 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用
相关文档:
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection framework)中看到泛型的动机。例如,Map类允许您向一个Map添 ......
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecut
6
推荐
在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。
一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepA ......
本文对 Java Debug Interface(JDI)及其使用进行了介绍,并通过实现一个多线程分析器的示例应用,演示了如何利用 JDI 开发自己的多线程调试程序。该示例分析器在独立于目标程序的前提下,以单个线程流为单位,帮助追踪记录多线程的执行过程信息。
多线程环境下的程序调试是让开发者头痛的问题。在 IDE 中通过添加断点的方 ......
在 Java 5 环境中,如果用类A去实现接口B (A implements B),在 Java 5 的平台下,A 实现的方法名前是不能添加 @Override 标记的,否则会报如下图所示的错误提示而无法编译:
{{----}}16172
经过尝试和总结,得出下表。
Version
Java 5
Java 6
超类型是 interface,子类型重写的方法能否添加@Override 标记
否
是
......