一个java运行起来执行代码,主要的内存消耗有这几块:

1、堆

2、栈 :栈是每个线程一个的,是以消耗的内存是内存大小*线程数,当线程数特多时候需要小心 。

3、直接内存:主要是通道时候的缓存,在内存不足是也会报OutOfMemoryError错误,外带sun.misc.Unsafe.allocateMemory异常(这个我认为类似于C中的malloc的功能) 。

4、socket的cache和buffer,这个也不在堆中分配,当无法分配时候,会报Too many open files 的错误。

5、jni代码中,类库执行的代码内存,也不再堆中。

6、虚拟机执行也要消耗一定的内存 。