Java内存分配机制:不朽内存与作用域内存详解
立即解锁
发布时间: 2025-08-21 02:11:47 阅读量: 2 订阅数: 6 


实时Java编程的核心与实践
### Java 内存分配机制:不朽内存与作用域内存详解
#### 1. 不朽内存的使用
不朽内存是一种特殊的内存区域,在 Java 编程中有着独特的应用场景。以下是几种在不朽内存中分配对象的方法:
- **使用 `newArray` 创建对象数组**:
```java
try{
aeh = (AsyncEventHandler [])
ImmortalMemory.instance().newArray(
AsyncEventHandler.class, 10);
} catch (IllegalAccessException access) {
System.out.println(access);
} catch (InstantiationException instant){
System.out.println(instant);
}
```
在这段代码中,我们尝试使用 `ImmortalMemory.instance().newArray` 方法创建一个包含 10 个 `AsyncEventHandler` 对象的数组。如果在创建过程中出现非法访问异常或实例化异常,程序会捕获并输出相应的异常信息。
- **使用 `enter` 方法创建不朽对象**:
```java
ImmortalMemory.instance().enter(
new Runnable() {
public void run(){
// In this scope immortal is the default for
// memory allocation
o = new Object(); // This Object is immortal
}
}
);
```
`enter` 方法允许线程临时将不朽内存作为其所有分配的默认内存区域。在上述代码中,`Runnable` 接口的 `run` 方法内创建的 `Object` 对象将被分配到不朽内存中。
- **创建默认使用不朽内存的线程**:
```java
Runnable logic = new Runnable(){
Object o;
public void run() {
o = new Object();
}
};
RealtimeThread rt= new RealtimeThread(null, null, null,
// This starts the thread in immortal
ImmortalMemory.instance(),
null, logic);
rt.start();
```
当创建实时线程时,可以将 `ImmortalMemory.instance()` 作为内存区域参数传递给 `RealtimeThread` 或 `NoHeapRealtimeThread` 类。这样,该线程将默认从不朽内存中进行所有分配,除非使用 `newInstance` 或 `enter` 方法从其他内存区域分配内存。
在大多数情况下,不朽内存中的对象应该在应用程序初始化时进行分配。如果应用程序在运行时创建不朽内存对象,很难提前确定运行该应用程序所需的不朽内存量,可能导致应用程序因耗尽不朽内存而崩溃。因此,理想的应用程序设计应包含一份必须驻留在不朽内存中的对象列表,并在应用程序初始化时创建这些对象。
#### 2. 作用域内存的类型与分配
作用域内存可以被称为“临时不朽”内存,它不会进行垃圾回收,但具有有限的生命周期,只要有线程可以访问它,它就会存在。作用域内存主要有以下四种类型:
| 分配时间 | 名称 |
| ---- | ---- |
| 线性 | LTMemory |
| 线性 | LTPhysicalMemory |
| 可变 | VTMemory |
| 可变 | VTPhysicalMemory |
##### 2.1 分配时间与算法
由于作用域内存中的对象会一起被释放,因此其分配算法可以很简单。以 `LTMemory` 为例,它通常使用的是一种近似于常数时间的分配算法,如以下伪代码所示:
```plaintext
static long * nextPtr;
static long * endPtr;
long * ctAllocate(const int longs){
nextPtr += longs;
if(nextPtr > endPtr)
return null; // Out of memory
else
return nextPtr;
}
```
该算法通过移动 `nextPtr` 指针来分配内存,如果 `nextPtr` 超过了 `endPtr`,则表示内存不足。`LTMemory` 被称为线性时间内存,是因为在分配对象内存后,JVM 需要对对象进行初始化,初始化时间与对象大小成正比。
`LTMemory` 创建对象的时间很容易预测,并且不会引发垃圾回收,这使得它在对性能可预测性有要求的场景中非常有吸引力。而 `VTMemory` 允许使用任意时间进行分配,RTSJ 实现可以使用任何算法来管理空闲内存,例如使用 C 的 `malloc` 函数。
##### 2.2 创建作用域内存
在使用作用域内存之前,需要先创建它。以下是创建一个 16KB 的 `LTMemory` 内存区域对象的示例:
```java
LTMemory mem = new LTMemory(1024*16, 1024*16);
```
可以使用普通的 `new` 语句随时创建作用域内存。作用域内存对象本身是一个普通对象,但与之关联的可分配内存是在一个特殊区域分配的,因此该内存没有隐式的引用限制。
作用域内存的分配和释放有一定的规则。RTSJ 要求作用域内存区域所代表的内存“不存在
0
0
复制全文
相关推荐









