为什么没有直接访问内存位置,如Java中的指针?

时间:2014-02-11 06:58:36

标签: java pointers memory

我知道指针是一个引用内存地址的变量,Java不支持指针,因为不安全和复杂性问题。那怎么可以直接在Java中访问内存寻址?但是Java仍然使用内存位置和操作部分。我们不能直接在Java中访问内存寻址,为什么访问时没有安全性?在Java中直接/间接访问内存操作的方式有多少?

如果我想编写基于内存管理概念的代码,那么我该如何用Java做呢?

避免不在Java中直接或间接访问内存位置的实际原因(除了复杂性或不安全之外还有其他原因)?我在google上看过这个但是我无法找到好的答案。

2 个答案:

答案 0 :(得分:2)

JVM的设计目标是防止由指针操作错误(编程错误)引入的各种内存损坏。

Java支持手动内存管理,但方式非常有限:

  • 操作字节存储器缓冲区(安全)
  • 直接内存操作(不安全)

查看以下Javadoc:

http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html http://www.docjar.com/docs/api/sun/misc/Unsafe.html

答案 1 :(得分:0)

您自己已经提到了安全原因。 Java程序在名为Java虚拟机(JVM)的容器中运行,该容器控制内存管理。这意味着程序无法直接访问内存,出于安全性和稳定性的原因:java程序不能破坏其他进程的内存。

其他原因是垃圾收集。与C ++一样,Java有new关键字为新对象分配内存。但是java没有delete。 GC不会自动删除不能再使用的对象。我想这是避免直接内存访问的一个很好的理由。

即使您在C程序中使用指针,也无法轻松访问可用于操作系统的整个内存。指针是为OS分配给您的进程的内存空间本地化的。

下一条评论是关于直接访问java中的内存。您有两种方法可以执行此操作:集成了Java和本机代码的JNI / JNA以及允许访问JVM托管堆外部内存的sun.misc.Unsafe

最后的评论甚至是问题:你为什么需要直接访问内存?