Java Resizable Array

原文链接:http://tutorials.jenkov.com/java-performance/resizable-array.html,如有侵权,立删

Java Resizable Array

  • Java Resizable Array - GitHub Repository
  • Resizable Array Use Case
  • Resizable Array Design
    • Keeping Track of Free Blocks
  • Expand on Write
  • Freeing Arrays
  • Using the ResizableArrayBuffer
    • Creating a ResizableArrayBuffer
    • Obtaining a ResizableArray Instance
    • Writing to a ResizableArray
    • Reading From a ResizableArray
    • Freeing a ResizableArray

有时候我们为了快速便捷的读取数据,想把数据保存在单个连续的数组里。这就需要数组是可以调节大小的,或者是可以扩张的。但是在Java中数组的大小是不可以调节的。你必须亲自实现一个可调节大小的数组,在本文中我将展示如何实现这个数组。

Java Resizable Array-GitHub Repository

  源代码哦:https://github.com/jjenkov/java-resizable-array

包含了三个classes和两个测试类

Resizable Array Use Case

想象下如果你有一个接受不同数据的Server,最小的数据4KB,大的1MB或者更大。

如果Server同一时间有1000K+的访问连接,我们需要知道要为数据提前分配多大的空间。我们不能仅仅只是分配一个最大的空间(1MB&16MB)为每个buffer。当有一千条连接访问Server时(100.000 × 1MB = 100GB),需要100GB的空间。

换一种思路,我们先从最小的信息开始处理,如果信息size超过了最小信息,那么我们重新分配一块空间并把原来的信息复制过去。如果信息又超过了现有的容量,那么再次分配并复制

使用这种策略,大多数信息将会使用最小buffer。这也就意味着Server的内存使用会变得非常高效,(100.000×4KB = 400MB),即使连接访问达到(1000.000 × 4KB = 4GB)。大多数Server也能hold住。

Resizable Array Design

resizable array 包含两个部分

  • ResizableArray
  • ResizableArrayBuffer

ResizableArrayBuffer包含一个单一,高容的数组。这个数组被分为三个部分。一个部分为small arrays,一个为medium size arrays 和 large array。

ResizableArray就表示单一,高容的数组,它的数据存储在ResizableArrayBuffer中的数组。

有图有真相

为了在ResizableArrayBuffer中的large array为各个大小不一的message预留空间,我们需要保证array不会被任意大小的message填充满。例如,接受了大量的small mesages,并不会占用全部的内存,但是却会阻塞Server接受medium和large message。相似的,接受大量的large或medium message也不会占用所有的内存,但却会使得另外连个message type产生阻塞。

假如所有的message都是从small messages开始,如果大量的small arrays被耗尽,无论medium array或large array是否有空间,都不会分配新的array。但是如果将small arrays的大小设置的合理,这种情况发生的概率就会降低。

即便small message部分全部被占用了,small message还是有可能会grow为medium and large messages的。

Keeping Track of Fress Blocks

未完待续

猜你喜欢

转载自www.cnblogs.com/AI-Cobe/p/10050620.html