JVM内存包含main memory和heap memory。
main memory存放对象变量的值,每个线程有自己的工作内存。变量的值对所有线程访问是共享的。 main不是由jvm管理的。
说到main memory,要提到volatile。在变量前面用volatile修饰的话,线程不会把该变量copy到工作内存操作,而是直接访问主存的变量。
heap memory结构图示如下:
permanent space:存放加载到jvm里面的class 对象。我们常配置的jvm 其空间大小不包含在heap memory里面。主程序不会在运行期间不会对permanent space 进行gc. permSize配置100,heap配置1000,,那么jvm大小至少有1100m
old space:存放生命周期比较长的对象
new Generation包括:
1. eden:存放刚被实例化的对象
2. from space和to space存放没被garbege collection回收的对象,总成叫 survivor spaces
面来看一下类被实例化的过程
1. 类实例化对象时候,jvm在eden为其分配空间
2. 当eden空间不够的时候,进行下面的流程
3. 清楚eden不活动的对象,如果空间还不够 存放新对象,则将eden的对象移到survivor spaces里面,如果
4. 清楚eden的垃圾对象
5. 将eden存活的垃圾对象copy到survivor spaces(from space 或to space)
6. 如果survivor spaces满了,则将survior的live对象copy到old space. old space 采用mark-compact算法
Refer to: http://hi.baidu.com/xuwanbest/blog/item/0587d82f2c44a73d1e30892e.html