Java内存区域
指针碰撞(Bump the pointer)
Java堆中内存是规整的,所有用过的内存放在一边,没用过的放在另一边,中间放在一个指针作为分界点的指示器。
Serial、ParNew等带有Compact过程的GC,系统采用内存碰撞;CMS这种基于Mark-Sweep的GC采用空闲列表。
TLAB(本地线程分配缓冲 Thread Local Allocation Buffer)
每个线程在Java堆中预先分配一小块内存。通过-XX:+/-UseTLAB来指定
运行时常量池(Runtime Constant Pool)
String类的intern()方法,1.6会复制到永久代,1.7则不会复制
多线程导致的StackOverflow
操作系统分配给进程的内存是有限的。虚拟机挺了参数来控制Java堆和方法区这两部分内存的最大值。
剩余内存 =(操作系统限制)- Xmx(最大堆容量)- MaxPermSize(最大方法区容量)
剩余内存由虚拟机栈和本地方法栈瓜分,每个线程分配到的栈容量越大,则可建立的线程数越少。32位操作系统因为操作系统限制为2G,容易出现此类问题。