Java虚拟机为每个进程提供了独立的虚拟地址空间,这个地址空间按照用途不同被分成了不同区域。每个区域有不同的回收策略。很多问题比如多线程只要画出内存区域就很好理解了。
内存区域粗略划分
栈
栈是线程私有的,每个方法对应一个栈帧,进入一个方法创建一个栈帧,从一个方法返回退出当前栈帧。参数,局部变量都是分配在栈上。
堆
Java将对象分配在堆上,又细分为老年代和新生代,主要的目的时提高垃圾回收效率,老年代对象存活率较高一般使用“标记-清理”或“标记-整理”算法。新生代每次垃圾回收都有大批对象死去,适合采用“复制”算法。
方法区
将class加载进内存所说的内存就是方法区,实际上并非一定要从class加载类,虚拟机规范也没强制要求,字节流可以从网络获取、zip包中获取,甚至运行时动态生成(动态代理)。
哪些对象是需要被回收的
1.引用计数算法
2.可达性算法
垃圾回收算法
1.标记清理算法
2.复制算法
3.标记整理算法
内存分配和回收策略
1.对象优先在Eden分配
2.大对象直接进入老年代
3.长期存活的对象进入老年代
参考资料:《深入理解Java虚拟机》