您的位置:首页 > 其它

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(老年代)

非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(本地方法栈);(上边有介绍)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: