JVM虚拟机

运行时数据区域

线程私有:
程序计数器 记录正在执行的虚拟机字节码指令的地址,本地方法则为空;
虚拟机栈 Java方法在执行时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息,调用至执行完成的过程,对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程;
本地方法栈 本地方法:一般为使用其他语言编写的被编译为基于本机硬件和操作系统的程序,本地方法栈为之服务。
- 堆是所有实例分配内存的地方,分为两块:新生代老年代。新生代又分为Eden(伊甸园)、From Survivor(幸存者)、To Survivor,是垃圾回收频率最高的区域。
- 方法区 存放类、静态变量、方法。是第三个代:永久代
- 运行时常量池(包含于方法区) Class 文件中的常量池在类加载后被放入运行时常量池。
- 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通脱一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

垃圾回收算法

1.标记-清除
标记需要清除的对象,统一回收。效率较低,容易出现大量内存碎片,连续内存不够。
2.标记-整理
标记对象,所有存活的对象都向一端移动,清理端边界以外的内存。复制操作较多,效率较低。
3.复制回收
将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。只使用了内存的一半。
分代收集
新生代使用:复制算法
老年代使用:标记 - 清除 或者 标记 - 整理 算法

垃圾回收器

Serial
ParNew
Parallel Scavenge
Serial Old
Parallel Old
CMS
G1


Minor GC 、Full GC触发时机
Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件:

(1)调用System.gc时,系统建议执行Full GC,但是不必然执行

(2)老年代空间不足

(3)方法去空间不足

(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。
新生代中的垃圾收集动作,采用的是复制算法
对于较大的对象,在 Minor GC 的时候可以直接进入老年代
Full GC:发生在老年代上,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。
Full GC 是发生在老年代的垃圾收集动作,采用的是 标记-清除/整理 算法。
由于老年代的对象几乎都是在 Survivor 区熬过来的,不会那么容易死掉。因此 Full GC 发生的次数不会有 Minor GC 那么频繁,并且 Time(Full GC)>Time(Minor GC)


CMS的过程为什么要标记两次
第一次仅仅只是标记一下 GC Roots 能直接关联到的对象,第二次则为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。

new一个对象会放在堆中

判定对象内存是否可以被回收
1.引用计数器算法
为对象添加引用计数器,被引用时+1,引用结束-1,为0时可被回收。
2.可达性算法
从GC Roots开始,能够达到的对象都是可以存活的,未能达到的则可被回收。

可以作为CGRoots的对象
1.虚拟机栈中引用的对象
2.方法区中静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI(Native方法)引用的对象

会发生内存泄露的情况
1.静态类持有短周期的外部对象引用
2.引用外部模块,未移除引用
3.数据库连接、网络连接和io连接等未释放连接
4.监听器未释放
5.集合中引用对象的属性值改变
6.静态集合类的引用,用完后未把引用从集合中删除

强引用: 把一个对象赋值给一个引用变量,使用 new 一个新对象的方式来创建强引用。

软引用:用SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。

弱引用:弱引用需要用WeakReference类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,总会回收该对象占用的内存。

虚引用:虚引用需要PhantomReference类来实现,为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。

G1原则:
简单可行的性能调优
取消新生代老年代划分
并发

初始标记
并发标记
最终标记
筛选回收

类加载
加载 验证 准备 解析 初始化 <- 加载过程//后续过程-> 使用 卸载

https://tech.meituan.com/jvm_optimize.html JVM优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值