Domanda

Alcune moderne schede di rete supportano l'accesso diretto alla memoria per migliorare le prestazioni. Come posso utilizzare questa funzione da Java?

La JVM lo fornisce automaticamente o devo fare un allocateDirect sui ByteBuffer che sto usando per parlare con quella scheda di rete?

Qualcuno ha documentazione che ne discute?

È stato utile?

Soluzione

Non è possibile farlo dall'interno di Java nelle tipiche JVM desktop / server, poiché si tratta dell'area del sistema operativo che richiede di raggiungere il codice C. Dai un'occhiata a JNI o ??JNA per vedere come farlo. Tieni presente che ciò potrebbe rendere fragile la tua applicazione se non la ottieni esattamente nel modo giusto.

Altri suggerimenti

È compito dei sistemi operativi utilizzare la funzione DMA della scheda di rete. Alla JVM non interessa davvero come lo fa il sistema operativo e utilizza semplicemente le funzioni del sistema operativo per parlare con "interfacce di rete".

Sì, la risposta di Ankon è giusta. Java opera in un sandbox - una macchina virtuale (da qui, la "VM" in JVM; Sun ha effettivamente creato UNA versione fisica - è in mostra da qualche parte).
Java non è mai stato progettato (intenzionalmente) per raggiungere al di fuori della sandbox, a differenza di ActiveX, che può andare praticamente ovunque su un PC.

Basti pensare a tutte le cose brutte che ActiveX ha fatto negli anni tramite un browser. Non vorresti che ciò accadesse con Java, vero?

Anche se ...

tu potresti essere in grado di creare un'istanza di un oggetto in Java che ha accesso all'hardware (come uno di quei controlli ActiveX, o qualche DLL, per esempio - che dovresti scrivere, troppo).

Il problema che vedo è il throughput. Con schede da 100 MB o 1000 MB, una JVM (ricorda, questa è una VM in esecuzione su un sistema operativo, quindi sei un paio di livelli rimossi dall'hardware) avrebbe la velocità di gestire ciò che sta accadendo sotto carico? Vorresti un programma Java che contenesse i dati nella tua scheda NIC mentre ne armeggiava (pensa all'impatto sul resto del sistema)?

A questo punto, probabilmente starai meglio scrivendo il duro lavoro della tua soluzione in C. E, se hai ancora bisogno di Java per giocare con quei dati, mettilo in un posto dove Java può arrivarci.

Se non stai ottenendo il throughput di rete di cui hai bisogno in java, dovrai scrivere un wrapper C per accedervi.

Hai eseguito il benchmarking del codice per scoprire dove sono realmente i tuoi problemi di prestazioni? Se ci fai sapere che probabilmente possiamo aiutarti senza ricorrere a JNI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top