从实践经验的角度出发,在处理小内存或者32位的应用问题时,除了Jaya堆和方法区之外,我们注意到下面这些区域还会占用较多的内存,这里所有的内存总和受到操作系统进程最大内存的限制: ·直接内存:可通过-XX:MaxDirectMemorySize调整大小,内存不足时抛出OutOfMemoryError或者OutOfMemoryError: Direct buffer memory . 报错如下 线程堆栈:可通过-Xss调整大小,内存不足时抛出StackOverflowError(如果线程请求的栈深度大于虚拟机所允许的深度)或者OutOfMemorvError(如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存) Socket缓存区:每个Socket连接都Receive和Send两个缓存区,分别占大约37KB和25KB内存,连多的话这块内存占用也比较可观。如果无法分配,可能会抛出IOException: Too many open files异常。·JNI代码:如果代码中使用了JNI调用本地库,那本地库使用的内存也不在堆中,而是占用Java康拟机的本地方法栈和本地内存的 ·虚拟机和垃圾收集器: 虚拟机、垃圾收集器的工作也是要消耗一定数量的内存的。