面试题答案
一键面试1. 接口定义
- MemoryResource 接口:
public interface MemoryResource { void allocate(); void release(); }
- 此接口定义了内存资源的基本操作,所有具体的内存资源类型(堆内存、栈内存、直接内存等)都将实现这个接口。通过这种方式,使得不同类型的内存资源具有统一的操作方式,便于框架进行统一管理。
2. 类的设计
-
CompositeMemoryResource 类:
import java.util.ArrayList; import java.util.List; public class CompositeMemoryResource implements MemoryResource { private List<MemoryResource> children = new ArrayList<>(); public void add(MemoryResource resource) { children.add(resource); } public void remove(MemoryResource resource) { children.remove(resource); } @Override public void allocate() { for (MemoryResource resource : children) { resource.allocate(); } } @Override public void release() { for (MemoryResource resource : children) { resource.release(); } } }
- 该类实现了
MemoryResource
接口,用于表示具有层级结构的内存资源集合。它内部维护一个MemoryResource
列表,通过add
和remove
方法来管理子资源。allocate
和release
方法会递归调用其子资源的相应方法,从而实现对整个层级结构的内存资源进行统一的分配和释放操作。
- 该类实现了
-
具体内存资源类(以堆内存为例,栈内存、直接内存类似):
public class HeapMemoryResource implements MemoryResource { @Override public void allocate() { // 实际的堆内存分配逻辑,例如调用JVM相关的API分配堆内存 System.out.println("Allocating heap memory"); } @Override public void release() { // 实际的堆内存释放逻辑,例如标记堆内存可回收 System.out.println("Releasing heap memory"); } }
- 具体的内存资源类实现
MemoryResource
接口,实现具体的内存分配和释放逻辑。不同类型的内存资源在这些方法中实现各自不同的管理策略。
- 具体的内存资源类实现
3. 各部分协作
- 构建层级结构:
- 可以通过创建
CompositeMemoryResource
对象来构建内存资源的层级结构。例如:
CompositeMemoryResource root = new CompositeMemoryResource(); HeapMemoryResource heap = new HeapMemoryResource(); StackMemoryResource stack = new StackMemoryResource(); root.add(heap); root.add(stack);
- 这样就构建了一个包含堆内存和栈内存的层级结构,
root
作为根节点,统一管理这两种内存资源。
- 可以通过创建
- 内存管理操作:
- 当需要分配内存时,只需调用根节点的
allocate
方法:
root.allocate();
- 此时,根节点
CompositeMemoryResource
会递归调用其所有子节点(这里是heap
和stack
)的allocate
方法,从而实现堆内存和栈内存的分配。同理,调用root.release()
方法可以释放所有相关内存资源。通过这种组合模式的设计,使得不同类型、不同层级的内存资源可以按照统一的方式进行高效管理,同时保持了良好的扩展性,便于添加新的内存资源类型或修改现有资源的管理策略。
- 当需要分配内存时,只需调用根节点的