在字节数组中存储对象引用

Anu*_*pta 2 java memory arrays byte object-reference

我有一个字节数组和一个对象引用.

    byte[] data = new byte[128];

    Block b = new Block();
Run Code Online (Sandbox Code Playgroud)

我想在"data"数组的最后2(或4)个字节中存储引用b .

请注意:我不想序列化对象并存储在字节数组中.我需要存储一个引用新块的指针(引用).

编辑

我的Block类如下

    public class Block {
        byte[] data ;

        public Block(){
            data = new byte[128];
        }
}
Run Code Online (Sandbox Code Playgroud)

基本上,数据数组将使用126个字节来存储字符串,并使用最后两个(或4个)字节来存储对另一个块的引用.它的链接列表.

我本可以使用Block类的不同定义[通过在类本身中包含对Block的引用]来完成它.但是问题语句指出只有最后2个字节的约束应该用作对另一个块的引用.从其他帖子我开始知道在jvm(32位)中,引用的大小为4个字节.因此我认为它只能使用最后4个字节来完成

来自问题陈述的片段

块的最后2个字节用于指向下一个块.假设文件是​​8块大小,那么第4块的最后2个字节将指向第5块,第5块的最后2个字节指向第6块,依此类推.

Pet*_*rey 5

基本上,数据数组将使用126个字节来存储字符串,并使用最后两个(或4个)字节来存储对另一个块的引用.它的链接列表.

您可以通过存储块索引来完成此操作.

例如

// list of blocks so you can lookup any block using a 16-bit index.
List<Block> blocks = new ArrayList<Block>();

int indexInBlocksToNext = ...
data[126] = (byte) (indexInBlocksToNext >> 8);
data[127] = (byte) indexInBlocksToNext;
Run Code Online (Sandbox Code Playgroud)

我本可以使用Block类的不同定义[通过在类本身中包含对Block的引用]来完成它.但是问题语句指出只有最后2个字节的约束应该用作对另一个块的引用.从其他帖子我开始知道在jvm(32位)中,引用的大小为4个字节.因此我认为它只能使用最后4个字节来完成

所有32位系统都使用32位指针或引用.您不能在Java中放置引用,因为没有通过数字引用对象的全局方式.您可以获取对象在内存中的位置,但此位置可以随时更改.


使用Java 7,启动之前使用的最小内存大约为1.3 MB.

$ java -mx1200k -version
Error occurred during initialization of VM
Too small initial heap for new size specified
$ java -mx1300k -version
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
Run Code Online (Sandbox Code Playgroud)

这意味着在程序启动之前,您已经使用了超过1 MB的预算.

  • 您可以使用JNI或`sun.misc.Unsafe`来获取`int`或`long`值的引用以查看其位置,但这只会告诉您它的位置,因为当您有数字时它可能已更改.对于64位JVM,它并没有真正告诉你绝对位置,因为它使用32位引用来存储高达32 GB的内存,并且可以使用转换的诸如`reference*8 + offset`来获取内存中的实际位置. (2认同)