jvm 202004笔记

jvm

在这里插入图片描述
内存模型
java javac javap 命令的使用

  • 栈:

又叫线程栈,每有一个线程,都有独自的栈,每进入一个方法都会为该方法创建独立的栈帧,保存着局部变量,操作数栈,动态链路,方法出口,线程私有,先进后出。
像这样的对象型局部变量(线程安全) Math math1 = new Math(); new的对象存放在堆中, math1 是堆的引用指向堆,即栈指向堆。同理,全局变量(线程不安全)如果是引用对象放在栈中,指向堆内存,如果是常量,静态变量等放在方法区。
在这里插入图片描述

  • 本地方法:native 关键字修饰
  • 方法区:
    JDK1.8 使用元空间 MetaSpace 替代方法区,元空间并不在 JVM中,而是使用本地内存。元空间两个参数:
    1 MetaSpaceSize:初始化元空间大小,控制发生GC阈值
    2 MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存

jvm HotSpot(3种jvm其中一个) 和堆

  • 堆内存:

在这里插入图片描述
对象被引用,无法被回收,太多后就会OOM。

  • JVM调优工具 Arthas ,还可以查看修改已经发布的线上代码。https://arthas.aliyun.com/doc/
  • STW (stop the world)指的是GC事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应, 有点像卡死的感觉,这个停顿称为STW
    为什么需要 STW ,堆内存 状态是可变的,可以GC 已经确定他不是垃圾,但是GC还没有执行完,他又变成了垃圾。
  • 让生命周期短的对象,在年轻代就被回收。尽量不发生FullGC
    垃圾回收器:

-Xms4m -Xmx4m -XX:+PrintGCDetails

在这里插入图片描述在这里插入图片描述

jProfiler

分析Dump文件,快速定位内存泄漏 。获得·堆中的数据。查看jvm 内存日志
在这里插入图片描述

垃圾回收算法:

在这里插入图片描述
为什么要进行垃圾回收?
随着程序的运行,内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要的系统异常。

哪些“垃圾”需要回收?
如果某个对象已经不存在任何引用,那么它可以被回收。

  • 复制算法:

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。反复去交换两个内存的角色,完成垃圾收集
确定;效率将会变低,内存没有充分使用。

  • 标记-清除算法:

就是分为标记和清除两个阶段进行处理内存中的对象
缺点:
效率问题,标记和清除两个过程的效率都不高;
空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-整理算法:是在标记清除法基础上做了优化,把存活的对象压缩到内存一端,然后直接清理掉端边界以外的内存(老年代使用的就是标记压缩法)

  • 分代收集算法(GC)

分代收集算法(Generational Collection)
1、根据对象存活周期的不同将内存划分为几块。
2、一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
3、在新生代中,每次垃圾收集时都发现有大批对象死去(回收频率很高),只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
其中,新生代又细分为三个区:Eden,From Survivor,ToSurviver,比例是8:1:1
4、老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。

垃圾回收统计信息
-XX:+PrintGC虚拟机启动后,只要遇到GC就会打印日志

-XX:+PrintGCDetails 查看详细信息,包括各个区的情况

-XX:+PrintGCTimeStamps 可以将时间和日期也加到GC日志中。表示自JVM启动至今的时间戳

-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间.可与上面混合使用

-XX:+PrintGCDateStamps 每一行就添加上了绝对的日期和时间。(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

-Xloggc:…/logs/gc.log 日志文件的输出路径

-XX:+PrintTLAB 查看TLAB空间的使用情况

新生代只是堆的一部分 新生代越大老年代越小,一般不允许新生代比老生代还大。考虑到GC最坏的情况 新生代全部复制到老生代会产生OOM错误,这个参数对系统性能以及GC行为有很大影响,新生代大小一般会设置整个堆空间的1/3到1/4左右

不同的堆分布情况对系统执行都会产生不一样的影响,实际配置的基本策略就是尽可能将对象预留在新生代,减少老年代的GC次数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值