JVM堆
2016-11-08 22:49:05 0 举报
JVM堆是Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,主要用于存放动态生成的对象和数组。在虚拟机启动时,Java堆会初始化为一个逻辑上连续的内存空间,这个内存空间的大小可以通过-Xms和-Xmx参数来指定。当需要分配内存时,就会从这个连续的内存空间中划出一部分给对象使用,当对象不再使用时,这块内存空间就会被垃圾回收器回收。由于Java堆是所有线程共享的,所以在多线程环境下需要进行适当的同步控制,以避免出现数据不一致的问题。
作者其他创作
大纲/内容
S0
jvm 堆内存结构
老年代(Old space)
年轻代(Young)
From space
To space
分代是Java垃圾收集的一大亮点,根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不同代的特点采用不同的收集算法,可以扬长避短
新生代:标记-复制算法
永久代(Permanent space)
幸存代(Survive)
Old Space
S1
Survive Space()
JVM为了提升GC效率, 将Survivor区分为S0和S1,这样就可以将对象回收和对象晋升分离开来。
方法区
将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。复制算法适用于新生代,因为垃圾对象多于存活对象,复制算法更高效。在新生代串行垃圾回收算法中,将eden中标记存活的对象拷贝未使用的s1中,s0中的年轻对象也进入s1,如果s1空间已满,则进入老年代;这样交替使用s0和s1。这种改进的复制算法,既保证了空间的连续性,有避免了大量的内存空间浪费。
Eden Space
主要存放应用程序中生命周期长的存活对象(标记-压缩算法(Mark-compact))
持久代也被成为方法区,方法区是全局共享的,在一定条件下也会被GC。 持久代存放JVM加载时的类型信息: 类型基本信息 常量池 类变量 方法信息 ClassLoader引用 Class类引用
对象通常最初分配到的地方
0 条评论
下一页
为你推荐
查看更多