如何在Java中创建特定内存中具有特定大小的对象?

时间:2011-01-07 06:15:35

标签: java memory-management

我不知道如何提出这个问题,但我想在特定地址(内存)中创建一个具有特定大小的对象。例如,class A {int, string, class B, List<array>}不应超过30 MB,否则会引发错误NoMoreMemoryException

我知道Java中没有指针(即使C ++黑客坚持)但是如何指向特定地址?

6 个答案:

答案 0 :(得分:1)

JVM的一个重要方面是内存被抽象化。你真的不能指向内存中的特定地址。

您可以在内存中获取对象的大小。查看here了解详情

答案 1 :(得分:1)

编写JNI代码并通过java代码调用。请查看用c编写的Object类的源代码,特别是clone方法,它在内存中进行按位复制以创建克隆对象。从那里你可以逻辑并在你自己的类中使用它来知道每个成员字段属性的大小。

答案 2 :(得分:1)

这应该让你中途: http://robaustin.wikidot.com/how-to-write-to-direct-memory-locations-in-java

就像文章所说,JVM需要控制内存才能获得访问权。

另一个更强大的选择是使用JNI并在C或C ++中执行您需要做的事情。

答案 3 :(得分:1)

你无法用纯Java做到这一点。如果由于某种原因您需要完全执行此操作,则应使用JNI / C.

作为一个注释,toString()方法(取决于实现)有时可以为您提供创建对象的初始地址,但JVM可以随时移动它。

答案 4 :(得分:1)

我假设你得到一个OutOfMemoryError,可能是因为你的-mx或-Xmx设置得太低了。

不清楚你的数据结构是什么或为什么你认为它不应该是30 MB,但是如今30 MB是计算机中相当微不足道的内存量。 8 GB的服务器成本约为850英镑。你在为移动设备编程吗?

查看结构使用量的最佳方法以及使用内存分析器的原因。 VisualVM是一个随Java一起提供的分析器。 YourKit是一个商业分析器,我发现它更好。

很可能你没有使用内存效率最高的结构,但是很可能它不会产生太大的影响。

也许如果你可以在提出更好的解决方案时澄清你在做什么。

在Sun / Oracle的JVM中,您可以指向内存中的特定位置并像C中那样分配/释放内存,但高度不太可能是个好主意。 ;)

答案 5 :(得分:0)

我知道这篇文章真的很老了,但我还以为我发表了评论: - )

只要由JVM管理,您就可以实际访问内存 使用sun.misc.Unsafe,它带来了一些允许用户使用的特殊方法 直接访问内存。

请注意,这是一个非常危险的类,这就是为什么它不仅没有记录,构造函数也是私有的,这意味着你必须使用Reflection。

你可以用它做一些好事。享受....