Newsgroup: it.comp.os.linux.development
Titolo: memoria disponibile e errori incomprensibili

Salve a tutti,
sto scrivendo con un mio amico un'applicazione client-server per lo scambio
di messaggi analago alle e-mail (è una tesina, non una idea malsana :). Il
client ha delle funzioni in C ed una interfaccia in Java. Le due parti
comunicano tramite JNI.
Quando il client riceve la lista dei messaggi accade che se ci sono meno di
4 messaggi va tutto bene, altrimenti la JVM dice che c'é stato un errore
nel codice nativo. L'errore in questione porterebbe alla generazione del
segnale 11 che dovrebbe essere il mitico segmentation fault.
Fin qua, niente di eccezionale.
La cosa eccezionale sta nel fatto che l'esecuzione si interrompe sempre in
punti diversi ed a volte dopo che il flusso è tornato ad eseguire codice
Java!
Mi spiego meglio. Non posto il codice perché è vermanete lungo.
Un metodo Java (A) chiama un altro metodo (B) per ottenere la lista dei
messaggi sul server. B effettua una chiamata ad una funzione nativa (C).C
fa quello che deve fare e restituisce a B una stringa che rappresenta la
lista dei messaggi.
Il programma si blocca a volte durante l'esecuzione di C altre dopo che
questa ha restituito la stringa a B e quindi dentro B.
Ma B è in Java!
Cioè la JVM dice che l'errore si è verificato nel codice nativo anche se
l'applicazione si blocca durante l'esecuzione di codice Java...
Spero di essermi capito. :)
Seconda cosa inspiegabile (almeno per me), questa volta nel server. Anche
qui l'esecuzione si interrompe noi punti piu' strani in momenti che non
sembrano correlati a niente e nell'esecuzione di funzioni come malloc()
fclose()... quasi mai nello stesso punto!
Non credo sia un puntatore a zonzo perché in questo caso l'errore si
verificherebbe sempre quando faccio riferimento al puntatore e cmq mai in
codice Java, giusto?
Allora mi domando: E' possibile che un uso poco accorto della memoria porti
al suo esaurimento il che causa l'interruzione nei punti piu' disparati? Ma
queste applicazioni non fanno un uso abbondante di memoria (trattamento di
stringhe niente di piu'), quanta memoria viene assegnata al massimo ad ogni
processo?
Scusate la lungaggine
Grazie
Matteo
-- 
chi sono e soprattutto chi non sono:
http://web.tiscali.it/sifoneteagnalla/
un piccolo programma per studenti universitari:
http://www.ifthenelse.it/leonetti/imsv/


La risposta credo che sia nel comando:
# ulimit -a
Alessandro.

 # ulimit -a
matish@linux:~> ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) unlimited
cpu time             (seconds, -t) unlimited
max user processes            (-u) 2047
virtual memory        (kbytes, -v) unlimited
da cui devo dedurre che non c'é alcun limite e che quindi la mia ipotesi è
infondata?
Grazie!


 ipotesi è infondata?
Non crederai di averne veramente a disposizione uan quantita' infinita
vero?-P
Il mio consiglio e' di tenere d'occhio l'applicazione con il comando "top"
ricordandoti che la memoria "cached" che viene visualizzata e' la cache del
disco e puo' essere considerata come se fosse libera.
Alessandro.

 vero?-P
Ovviamente no :)
Ma la memoria disponibile è tutta la memoria fisica,quella virtuale una
parte di una delle due?
Grazie (anche per lo scambio in tempo reale :)


parte di una delle due?
Se non erro, salvo opzioni di compilazione particolari del kernel, su 
architettura a 32 bit il singolo processo non puo' indirizzare piu' di 2Gb di
memoria.
Oltre a questo limite logico c'e' il limite fisico della memoria disponibile
nel sistema che e' dato dalla somma della RAM + spazio di swap.
Alessandro.