为堆栈上的对象预分配内存,而不是堆JAVA上的内存

Ofe*_*Ron 0 java memory new-operator

考虑c中的LinkedList例子,其中我显式预先分配堆栈上的N个节点结构用作池或节点堆栈,而不是使用慢mallocs和frees,(我不需要在运行中释放节点的功能,所以堆栈会这样做):

#define N 40000

typedef struct node_t {
    void * ele;
    struct node_t * next;
}node,*Pnode;

node Stack[N];//memory allocation for the linkedlist nodes
int sp=0;

Pnode createNode(void * x) {
    Pnode temp=&Stack[sp++];
    temp->ele=x;
    temp->next=NULL;
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

当我试图在JAVA中模仿上面的想法时,那就是我想出来的......你能完成这个类,使Node []堆栈成为一个节点对象数组,该内存是在STACK中预先分配的吗?

public class Node<E>  {

    private final static int n = 40000;
    private static Node[] stack = ?
    private static int sp = 0;

    private E ele;
    private Node next;

    private Node () {}
    public Node createNode(E e) {
        stack[sp].ele=e;
        stack[sp].next=null;
        return stack[sp++];
    }
}
Run Code Online (Sandbox Code Playgroud)

Basiclly我想知道这个,因为我知道我想从我的程序能够做什么,而且我知道我不需要能够释放和重用一块内存,我希望能够快速分配一个Node对象即使我的程序几乎有一个HEAP OVERFLOW,也会点亮.最大容量为N的节点堆栈和像我一样的运行索引对我来说是完美的...

NPE*_*NPE 6

不.Java没有明确的机制来在堆栈上分配内存.

使用new是分配内存的唯一方法.然后由JVM决定内存的来源,并从那时起对其进行管理.

编辑:我刚看了你的代码.你甚至没有在堆栈上分配内存.您似乎正在做的是拥有一个存储在数据段上的堆栈数据结构,并且您自己管理.

在Java中,没有直接的等价物:

node Stack[N];
Run Code Online (Sandbox Code Playgroud)

换句话说,没有办法N在连续的内存块中构造对象.您必须分配一个N引用数组,然后创建N对象.

也就是说,请记住,在现代JVM中,new基本上相当于指针凹凸.这是:(a)便宜; (b)与你正在做的相似sp.

  • @OfekRon:正如我一直试图解释的那样,C结果不会自动应用于Java.在我的PC上,分配像你这样的5000万个对象并将它们存储在Java数组中大约需要10秒钟.无论如何,在我们看到一些实际的代码和基准之前,这个讨论并没有真正发生. (3认同)
  • @OfekRon:IMO你过早地进行了优化.对其进行编码,对结果进行分析,**如果速度太慢**,则使用您的确切基准显示您的特定代码.然后,我们将为您提供有关如何加快速度的具体建议. (2认同)