JVM内存模型和垃圾收集

《深入理解Java虚拟机》读书笔记

一、JVM体系结构


程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。

虚拟机栈:是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。


本地方法栈:跟虚拟机栈类似,虚拟机栈是为虚拟机执行java方法(字节码)服务,本地方法栈为虚拟机执行本地方法服务。

Java堆:是被线程共享的一块内存区域,创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。

方法区:是线程共享的内存区域,用来存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池:是方法区的一部分,用于保存编译期生成的各种字面量和符号引用。String的intern()会把这个字符串对象放到常量池。


二、JVM运行时数据区


所有线程共享的数据区 = 堆+方法区(hotspot JVM用永久代实现方法区)

堆内存 = 老年代+年轻代(新生代)

年轻代=Eden + S0 + S1

JVM常用内存参数说明


大小分配计算原则


数据来自《Java性能优化权威指南》

三、对象是否可以回收

1、引用计数算法

2、可达性分析算法

GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象

四、垃圾收集算法

 1、标记-清除算法(产生碎片)



2、复制算法(新生代)


新生代将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例8:1。

3、标记-整理算法 (老年代)



4、分代收集算法



五、垃圾收集器

1、Serial收集器

 Serial收集器是一个单线程的收集器,采用复制算法,用于新生代的垃圾收集。

2、ParNew收集器

ParNew是Serial收集器的多线程版本,采用复制算法,用于新生代的垃圾收集。

3、Parallel Scavenge收集器

Parallel Scavenge收集器是新生代收集器,采用复制算法,主要是为了达到一个可控制的吞吐量(Throughput)。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。

4、Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,用于老年代的垃圾收集。

5、Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,用于老年代的垃圾收集。

6、CMS收集器

CMS收集器(Concurrent Mark Sweep)是以获取最短回收停顿时间为目标的收集器。是基于标记-清除算法实现的。

7、G1收集器

G1收集器(Garbage-First)将堆内存(新生代和老年代)划分成多个大小相等的独立区域(Region),根据各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需要的时间的经验值),优先回收价值最大的Region。

六、内存分配与回收策略

1、对象优先在Eden分配

2、大对象直接进入老年代

3、长期存活的对象将进入老年代

4、动态对象年龄判断

5、空间分配担保

Minor GC:清理新生代

Major GC:清理老年代

Fuu GC:清理整个堆空间(包括新生代和老年代)

因为Full GC会引起STW(Stop The World),不会对用户代码作任何响应,应当尽量避免Full GC。
什么时候会触发Full GC?
1、老年代空间不足
2、永久代空间满
3、CMS GC时出现promotion failed和concurrent mode failure
4、统计得到的Minor GC晋升到老年代的平均大小大于老年大的剩余空间(空间分配担保失败)
5、主动触发Full GC(执行jmap -histo:live [pid]或者显示调用System.gc())来避免碎片问题

七、垃圾收集日志

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值