jvm-垃圾收集器和内存分配策略(这只是一些关键点,并没有深入理解)
2018-04-02 12:19
537 查看
1 方法区(对象类型数据)、虚拟机栈(局部变量表,操作数栈等)、本地方法栈(为jvm使用到的Native方法服务)、堆(存放对象实例)、程序计数器(当前线程执行的字节码的行号指示器)
2 java堆(新生代,老年代)(-Xmx和-Xms控制)
Eden空间,From Survivor空间、To Survivor空间等
3 方法区(永久代 Permanent Generation)
3.1 运行时常量池
3.2 直接内存(NIO的DirectByteBuffer)
3.3 对象的创建
内存分配
划分可用空间:指针碰撞、空闲列表;
解决线程安全问题:对分配的内存空间的动作进行同步处理(CAS+失败重试)、把内存分配的动作按照线程划分在不同的空间之间进行(分配本地线程分配缓冲Thread Local Allocation Buffer 参数为-XX:+/-UseTLAB)
初始化内存空间为零值
对对象进行必要的设置(对象是哪个类的实例)
3.4 对象的内存布局
3.4.1 对象头 (对象运行时的数据(Mark Word)、类型指针)
3.4.2 实例数据(各种字段内容)
3.4.3 对齐填充
3.5 对象的访问定位(句柄访问、指针访问)
4 OutOfMemoryError异常
5 垃圾收集器
Serial(Stop the World+复制算法+Client客户端)、ParNew(多线程版本的Serial+Server服务端)、Parallel Scavenge(新生代+复制算法+并行多线程+达到某个吞吐量(运行用户程序/(运行用户程序+垃圾回收),后台计算场景)、G1(???)、CMS(最短回收停顿时间+Current Mark Sweep,并发收集器+标记清除,交互场景(响应快))、Servial Old(Stop the World+标记整理算法+Client客户端)、Parallel Old(老年代+多线程+标记整理算法)
6 Full GC + Minor GC
Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC;
Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;
7 java内存区详解
JVM区域总体分两类,heap区和非heap区。
heap区又分为:
- Eden Space(伊甸园)(新生代)
- Survivor Space(幸存者区)(新生代)
- Old Gen(老年代)
7.1 Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。
7.2 Survivor Space幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。
7.3 Old Gen老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象,这些对象的年代已经足够old了,就会放入到老年代。
7.4 Code Cache代码缓存区,它主要用于存放JIT所编译的代码。CodeCache代码缓冲区的大小在client模式下默认最大是32m,在server模式下默认是48m,这个值也是可以设置的,它所对应的JVM参数为ReservedCodeCacheSize 和 InitialCodeCacheSize
7.5 Perm Gen全称是Permanent Generation space,是指内存的永久保存区域,因而称之为永久代。这个内存区域用于存放Class和Meta的信息,Class在被 Load的时候被放入这个区域。因为Perm里存储的东西永远不会被JVM垃圾回收的,所以如果你的应用程序LOAD很多CLASS的话,就很可能出现PermGen space错误。默认大小为物理内存的1/64
7.6 Jvm Stack(java虚拟机栈); (上边有介绍)
7.7 Local Method Statck(本地方法栈);(上边有介绍)
2 java堆(新生代,老年代)(-Xmx和-Xms控制)
Eden空间,From Survivor空间、To Survivor空间等
3 方法区(永久代 Permanent Generation)
3.1 运行时常量池
3.2 直接内存(NIO的DirectByteBuffer)
3.3 对象的创建
内存分配
划分可用空间:指针碰撞、空闲列表;
解决线程安全问题:对分配的内存空间的动作进行同步处理(CAS+失败重试)、把内存分配的动作按照线程划分在不同的空间之间进行(分配本地线程分配缓冲Thread Local Allocation Buffer 参数为-XX:+/-UseTLAB)
初始化内存空间为零值
对对象进行必要的设置(对象是哪个类的实例)
3.4 对象的内存布局
3.4.1 对象头 (对象运行时的数据(Mark Word)、类型指针)
3.4.2 实例数据(各种字段内容)
3.4.3 对齐填充
3.5 对象的访问定位(句柄访问、指针访问)
4 OutOfMemoryError异常
5 垃圾收集器
Serial(Stop the World+复制算法+Client客户端)、ParNew(多线程版本的Serial+Server服务端)、Parallel Scavenge(新生代+复制算法+并行多线程+达到某个吞吐量(运行用户程序/(运行用户程序+垃圾回收),后台计算场景)、G1(???)、CMS(最短回收停顿时间+Current Mark Sweep,并发收集器+标记清除,交互场景(响应快))、Servial Old(Stop the World+标记整理算法+Client客户端)、Parallel Old(老年代+多线程+标记整理算法)
6 Full GC + Minor GC
Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC;
Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;
7 java内存区详解
JVM区域总体分两类,heap区和非heap区。
heap区又分为:
- Eden Space(伊甸园)(新生代)
- Survivor Space(幸存者区)(新生代)
- Old Gen(老年代)
非heap区又分: - Code Cache(代码缓存区); - Perm Gen(永久代); - Jvm Stack(java虚拟机栈); - Local Method Statck(本地方法栈);
7.1 Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。
7.2 Survivor Space幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。
7.3 Old Gen老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象,这些对象的年代已经足够old了,就会放入到老年代。
7.4 Code Cache代码缓存区,它主要用于存放JIT所编译的代码。CodeCache代码缓冲区的大小在client模式下默认最大是32m,在server模式下默认是48m,这个值也是可以设置的,它所对应的JVM参数为ReservedCodeCacheSize 和 InitialCodeCacheSize
7.5 Perm Gen全称是Permanent Generation space,是指内存的永久保存区域,因而称之为永久代。这个内存区域用于存放Class和Meta的信息,Class在被 Load的时候被放入这个区域。因为Perm里存储的东西永远不会被JVM垃圾回收的,所以如果你的应用程序LOAD很多CLASS的话,就很可能出现PermGen space错误。默认大小为物理内存的1/64
7.6 Jvm Stack(java虚拟机栈); (上边有介绍)
7.7 Local Method Statck(本地方法栈);(上边有介绍)
相关文章推荐
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(1)
- 读 - 深入理解java虚拟机 - 笔记(六-4) - 垃圾收集器和内存分配策略(3章)-内存分配
- [jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略
- 读 - 深入理解java虚拟机 - 笔记(六-3) - 垃圾收集器和内存分配策略(3章)-垃圾收集器
- 深入理解JVM:垃圾收集器与内存分配策略
- 深入理解JVM(三)——垃圾收集策略详解
- 深入理解JVM(三)——垃圾收集策略具体解释
- java面试-深入理解JVM(三)——垃圾收集策略详解
- 深入理解JVM:垃圾收集器与内存分配策略
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第三章垃圾收集器与内存分配策略
- 深入理解JVM-3垃圾收集器与内存分配策略
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(2)
- 读 - 深入理解java虚拟机 - 笔记(六-1) - 垃圾收集器和内存分配策略(3章)-对象已死吗
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(3)
- 深入理解JVM(三)——垃圾收集策略详解
- 深入理解JVM(三)——垃圾收集策略详解
- 深入理解JVM(三)——垃圾收集策略详解
- 深入理解JVM虚拟机 垃圾收集和内存分配
- 深入理解JVM笔记二---垃圾收集器及内存分配策略
- 深入理解JVM(五)——HotSpot垃圾收集器详解