Java中是否有类似于malloc/free的功能?

11

我从未见过这样的语句,它在Java世界中真的存在吗?

5个回答

18

Java中的malloc版本是new -- 它创建一个指定类型的新对象。

在Java中,内存管理是自动进行的,因此您不能显式地deletefree一个对象。


那么我不能直接访问内存空间吗? - java
不,你不能通过任何合理的方式访问Java对象的底层指针/内存地址。C#允许您使用“unsafe”关键字来实现这一点:http://msdn.microsoft.com/en-us/library/chfa2zb8(v=VS.100).aspx请注意,这非常非常少见。 - ClosureCowboy
将要释放的对象引用设置为 null,告诉垃圾回收器可以释放内存。 - user801154

5

Java有垃圾回收功能,这就是为什么你的代码中从来不会看到这样的语句(如果你问我的话,这很好)

在计算机科学中,垃圾回收(GC)是一种自动内存管理形式。它是资源管理的一个特殊情况,被管理的有限资源是内存。垃圾回收器或者只是收集器,试图回收垃圾或者是程序不再使用的对象所占用的内存。垃圾回收是由John McCarthy在1959年左右发明的,用于解决Lisp中的问题。


4

new代替malloc,垃圾回收器代替free。


4

Java中不存在直接的等价物:

C语言中的malloc创建一个未定义类型的堆节点,并返回指向它的指针,使您可以自由地访问内存。

Java没有未定义类型对象的概念,也不允许您直接访问内存。在Java中最接近malloc的方法是new byte[size],但它会返回一个强类型的对象,您只能将其用作字节数组。

C语言中的free释放了一个堆节点。

Java不允许您显式释放对象。在Java中,对象的释放完全由垃圾回收器控制。在某些情况下,您可以影响GC的行为;例如,通过将null赋值给引用变量并调用System.gc()。但这并不会强制释放对象...而且这是一种非常昂贵的方式。


3
如果你有恶意(t m),我想你可以通过JNI接口访问原始内存。这是您可以从Java程序调用C程序的地方。当然,您必须在具有执行此操作权限的环境中运行程序(浏览器通常不会允许此操作,除非它是自杀性的),但您可以通过C指针访问对象。
我有点好奇原始问题来自哪里。很久以前,我对于不需要C风格的内存管理和C风格的指针的概念持怀疑态度,但现在我是一个真正的信徒。

点赞指出JNI - 虽然这并不会自动允许访问对象管理,但使用JNI,如果他们愿意,可以处理“非受控”内存/资源。 - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接