`
- 浏览:
23242 次
-
Java程序开发人员需要了解各个存储区域的特点以及对性能的影响。然后再根据需要来调整应用程序的区域分配。总的来说,在操作系统中有五个地方可以用来保存应用程序运行中的数据。这类区域的特点以及对性能的影响分析如下。
存储区域一:寄存器
虽 然同在内存中,但是不同的区域由于用途不同,其性能也有所不同。如就拿Java应用程序来说,寄存器由于其处于处理器的内部,为此这个区域存取数据最快。 跟内存中的其他存储区域有着天壤之别。那么我们把所有对象都放到这个区域内,不就可以提高Java应用程序的性能了吗?理论上是如此,但是在现实中是行不 通的。因为这个寄存器的数量是非常有限的。在内存中的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。所 以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。
存储区域二:堆栈
对象的创建有两种方式,一是在应用程序开发的过程中就创建对象;二是在程序运行的过程中要用到对象的时候再来创建对象。前者比后者性能要高,而后者比前者 要灵活。这主要是因为前者创建对象的时候,就是这个堆栈中创建的。虽然其创建的对象没有保存在寄存器中,但是通过这个对象的推栈指针可以直接从处理器哪里 获得相关的支持。如堆栈指针往上移动的时候,则释放原有对象占用的内存;如堆栈指针向下移动时,则为对象分配新的内存。所以,如果把对象存放在这个堆栈 中,虽然性能没有像存放在寄存器中那么理想,但是仍然比存储在其他地方要好的多。
由于Java程序是在程序运行过程中才根据需要来创建对象。为此对象就不能够保存在这个堆栈中。不过Java应用程序也不能够白白的浪费这个宝贵的空间。 为此虽然Java对象本身没有保存在这个堆栈中(不是不保存而是这里没有他的容身之地),但是还是应该把一些可以放的内容放到这个堆栈中,以提高应用程序 的性能。如可以把一些对象引用存放在这个堆栈中。
另外对于一些基本的数据类型对象,Java程序也往往把他们放置在堆栈中,以提高数据处理的性能。如一些整数型、字符型的数据对象,这些对象有些共同的特 点,如对象比较小、是Java程序提供的标准对象等等。对于这些对象由于每个应用程序基本上都需要用到,而且我们程序开发人员只能够引用这些对象,而不能 够对其进行更改。为此Java程序在处理的时候,往往一开始就创建了对象(即直接在堆栈中创建对象并保存),而不像其他对象一样,在需要的时候才创建。只 所以在堆栈中创建这些对象,还有一个重要的原因。因为如果在堆栈中创建对象的话,Java编辑器必须知道存储在堆栈内所有数据的确切大小和生命周期。为了 得到这些信息,必须产生相关的代码来获得这些信息,以便其操作堆栈指针。普通的对象大小、生命周期等等难以预先获得,为此在堆栈中创建普通的对象,对于 Java应用程序来说并不是很合适。相反,这些Java编译器预定义的对象大小并不会随着机器硬件架构的变化和用户需求的变化而变化;而且这些对象往往从 始之终都会存在的,所以也不存在生命周期的问题。所以把这些对象放置在堆栈中是合理的,也是可实现的。如此处理,不仅不会影响到对象的灵活性,而且还可以 提供比较好的性能。
存储区域三:堆
堆虽然跟堆栈一样,都是随机访问存储器中的区域,但是两者有很大的不同。因为在堆中,没有堆栈指针,为此也就无法直接从处理器那边获得支持。为此其性能跟 堆栈比起来,就有一定的差距。通常情况下,除上面所说的一些预定义对象之外,其他的对象都是保存在这个堆中的。或者说,利用new关键字创建的对象都是保 存在堆中的。保存在堆中其好处也是显而易见的。如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。所以 在堆里分配存储有很大的灵活性。当需要对象时,我们可以使用New关键字建立一个对象。然后系统会自动给这个对象在堆中分配一个区域让其作为归宿。不过其 最大的不足之处,就是在堆中创建对象与分配存储区域,要比在堆栈中慢许多。鱼与熊掌不能兼得呀。
存储区域四:静态存储区域与常量存储区域
在Java对象中有一些特殊的元素。如有些元素是比较特别的(如利用关键字Static定义的变量)。这些变量对于其他对象来说,可能就是静态的。为了更 好的管理这些变量,Java在内存中专门划分了一个静态存储区域来管理这些元素。这里的静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数 据。这里需要明确的一点就是,Java对象是不保存在这个地方的,而只是把对象中的一些特殊元素放置这里。由于位置固定,所以下次调用的时候就省去了查找 的麻烦。为此其对于提供应用程序的性能是有利的。作为我们程序开发人员来说,在书写代码的时候,就需要灵活应用Static这个关键字。笔者的意见是,能 用则用;不能用的时候也要想着法儿用。特别是有些元素用不用Static关键字时对于程序功能没有影响,此时我们要理直气壮的在元素前面加上Static 关键字。
在Java对象中还有一类特殊的元素,我们叫做常量。由于常量的值是稳定不变的,如圆周率。为此把他们放在代码的内部是可行的。不过有些时候,在进行一些 嵌入式系统开发的时候,我们往往不这么做。而是会把常量元素跟代码分开来保存。如我们会根据情况把常量的值存放在一些只读存储器中。这主要是为了一些特殊 的功能考虑的。如出于版权控制的需要。如在打印机上为了保护原装耗材的版权,往往把常量跟代码分开存放。
存储区域五:非RAM存储
有时候,有些程序运行所需要的数据我们还会放置在其他地方。如在一些系统中需要用到流对象,这个对象的数据并没有保存在上面所谈到的任何一个存储区域,这 个对象直接被转为为字节流,发送到其他的主机上去了。另外有一种叫做持久化的对象,其是被存储在硬盘中的。这些对象平时在应用程序开发过程中用到的并不是 很多,大家只需要了解有这些对象的存在即可。等到需要用到的时候,再去深入研究也不迟。
从上面的分析中我们可以看到,对象的归属我们程序开发人员很难控制。寄存器是编译器来管理的。而堆与堆栈又基本上受到开发平台的限制,我们程序人员也没有 这个能耐来干涉他们。其实我们主要能够调整与控制的就是第四个存储区域,即静态存储与常量存储。笔者的建议是,对于非嵌入式程序,能够利用静态存储来实现 的,就尽量采用静态存储。而对于常量来说,需要根据需要实现的功能来判断是否需要把常量存储在只读存储器中。有时候对于版权的保护等等需要用到这个只读存 储器
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Java虚拟机(JVM)是Java程序运行的核心,它的内存模型和垃圾收集机制对于理解Java应用程序的性能至关重要。以下是对面试中可能出现的JVM相关知识点的详细解释: 1. **内存模型与分区**: - **方法区(Method Area...
- **堆区(Heap)**:堆区是Java虚拟机所管理的内存中最大的一块,主要用于存放对象实例。任何对象的创建都在堆区完成。具体来说,堆区又分为新生代和老年代。新生代主要负责年轻对象的生命周期管理,通常采用复制...
Java虚拟机(JVM)是Java开发的核心组成部分,它负责执行Java程序并管理内存。面试中,JVM的深入理解是衡量开发者技能的关键指标。以下是对JVM内存模型及其相关知识点的详细阐述: 1. **内存模型及分区**: - **...
此外,JVM还有内存管理和优化策略,如堆内存的分区(新生代、老年代、永久代或元空间)、对象分配策略、栈内存的管理等。这些细节对于理解Java程序的性能和内存使用情况至关重要。 深入理解JVM对于Java开发者来说是...
- **内存分区**:新生代、老年代等分区策略,针对不同生命周期的对象进行高效管理。 - **垃圾收集策略**:包括串行、并行、并发和停顿(Stop-the-World)等,优化系统响应时间和吞吐量。 6. **JVM调优**: - **...
- Java 堆:存储所有对象实例。 - 方法区:存储类的信息、常量、静态变量等。 - 虚拟机栈:每个线程拥有一个栈,存储局部变量等。 - 本地方法栈:与虚拟机栈相似,用于本地方法调用。 - 程序计数器:线程私有的...
### JAVA快速排序(递归实现与非递归堆栈模拟实现) #### 一、递归实现的快速排序 快速排序是一种非常高效的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有记录都比另一...
2. 内存分区:堆内存分为新生代和老年代,新生代又细分为Eden和两个Survivor空间。对象首先在Eden区分配,经历多次GC后仍存活则晋升到老年代。 3. 栈内存:每个线程都有自己的虚拟机栈,用于存储局部变量表、操作数...
2. **JPanel**: JPanel是Swing中的组件容器,通常用于组织和布局游戏中的各个部分,比如卡牌区域、堆栈区和计分区。开发者可以通过自定义JPanel类,实现特定的游戏逻辑。 3. **JButton**: 游戏中的操作按钮,如“新...
37. **堆栈区分**:堆提供动态内存分配,方便对象共享;栈内存分配快速,但大小有限。 38. **栈起点与程序起点**:main方法所在类的栈帧是栈的起点,也是程序执行的起点。 39. **基本类型不放堆**:基本类型大小...
标题中的“通过HSDB来了解String值的真身在哪里1”指的是使用HSDB(HotSpot Serviceability Debugger)工具来探究Java程序中String对象的具体存储位置,特别是关注String的值(字符数组value)在内存的不同区域如何...
- **堆区**:用于存储所有对象实例和数组,是Java中动态分配内存的主要场所。Java程序中的对象创建都发生在堆区,这部分内存由垃圾回收器管理。 #### Package与包的概念 - **包**:类似于文件夹,用于组织相关的类...
堆(Heap)是Java中的动态内存区域,主要用于对象的分配和存储。当创建一个对象时,它的引用会被放到栈上,而对象本身则存放在堆中。堆内存没有固定的大小限制,可以动态扩展,但这也意味着它的内存分配和回收相比栈...
永久代( Permanent Generation)在Java 8之前是方法区的一部分,用于存储类的元数据,如果这部分空间不足,确实可能导致内存溢出,但在Java 8后已被元空间(Metaspace)取代,元空间使用的是操作系统内存,理论上...
- **堆栈简图**:栈通常用于存储方法的局部变量和计算中间结果,而堆则用于存储对象实例。 - **栈与堆的区别**:栈内存分配快速,按需分配,自动回收,而堆内存分配较慢,由垃圾回收器管理。 - **堆和栈分开的好处**...
1. **内存模型和分区**: - **方法区(Method Area)**:存储类信息,包括常量池、静态变量、编译后的字节码等。 - **堆(Heap)**:主要存放对象实例和数组,分为新生代(Young Generation)和老年代(Old ...
Java虚拟机(JVM)是Java程序运行的核心,它负责管理程序的内存、执行字节码以及确保程序的正常运行。本文将详细讨论JVM内存模型、对象创建与分配、垃圾收集机制以及类加载过程。 1. **JVM内存模型**: - **堆区**...
- **堆区(Heap)**:这是应用程序中最主要的内存区域,用于存储对象实例和数组。新创建的对象默认放在新生代中的Eden区,经过几次GC后可能会晋升到老年代。 - **栈区(Stack)**:每个线程都有一个私有的栈空间,...
- 内存管理:垃圾回收机制,内存泄漏,堆栈与堆的区别。 - 多线程:线程同步与通信,线程池,死锁,活锁的概念。 - 集合框架:List, Set, Queue, Map的实现类及其特性,泛型,迭代器等。 - 反射:动态类型,类...
- 内存管理:理解堆栈内存的区别,熟悉垃圾回收机制。 - 集合框架:List、Set、Map接口的使用,以及ArrayList、LinkedList、HashMap等实现类的特点。 - 多线程:线程的创建方式,同步机制(synchronized关键字、...