JVM优化

1.对象分配:新生代(1/3)首先将我们的new的对象放在Eden(8/10)区,当Eden区满了,触发Monitor GC,1就通过可达性算法来识别这个对象可不可用(常见的是类静态变量的引用,常量的引用,工作线程(虚拟机栈,本地方法栈)用的对象),把存活的对象放在存活区(from(1/10))。然后再次回收的时候,就会把Eden和From区存活的对象,拷到to(1/10)区去,如果年龄相同的对象占用一半存活区,就会提前晋级。垃圾回收(stop the world)停止了工作线程,执行执行垃圾回收完毕。
2.对象晋级
一些比较大的数据比如数组,就会放在老年代(2/3)中。
3.垃圾回收的算法
@1.标记清除法
效率问题:缺点标记和清除过程的效率不高,空间问题:内存碎片化,无法找到足够的内存就会monitor gc.
@2.复制算法
对整个半区进行回收,内存分配的时候不必考虑内存碎片问题
垃圾回收后空间连续,只要移动堆项指针,按顺序分配内存即可
特别适用java朝生夕死的对象特点
缺点:内存分为两块。浪费资源。存活率高的复制操作,效率低。如果不使用50%的对分策略,老年代需要考虑的空间担保策略。
@3.标记整理算法
1.不会损失50%的空间,垃圾回收空间连续,只要移动指针按顺序分配,按顺序分配内存即可;比较适合大量存活对象的垃圾回收。效率比复制算法低。
@4.分代收集
分了不同的区域,每个不同的区域,使用不同的算法。
4.垃圾回收器
新生代:serial(复制算法,单线程),parnew(复制算法,多线程),paraller scanvenge(关注吞吐量)
老年代:serial old(单线程,标记整理),,paraller old(多线程,标记整理)
cms(多线程,标记清除,并发并行执行,垃圾回收的时候,工作线程不会停止)。
缺点:内存碎片,cpu资源,更大的堆内容(给工作线程预留)。
g1:新生代,老年代都适用。分区回收。化整为0。优先级列表,优先级高的先回收。所以回收时间可以预测。
吞吐量:运行用户代码代码/运行用户代码时间+垃圾回收时间
垃圾收集时间=垃圾回收频率*单次垃圾回收时间
monitor gc 对新生代,major gc 对老年代。monitor gc+major gc 就是full gc
触法Full gc 的条件:
system.gc()
老年代空间不足
永生代空间不满足,
统计Monitor gc晋升到老生代的平均大小的剩余空间。
分配很大的对象

常见的调优工具:jps,jstat,jinfo,jstack,jconsole,jvistualvm
对堆dump分析
堆溢出,栈溢出,本地方法栈溢出。
如果是堆溢出,导出堆dump,并对堆内存使用有个了解。找到最有可能导致内存溢出的元凶,通常也就是消耗内存最多的对象。使用辅助工具对dump文件进行分析

对线程dump分析。
那些线程一直在运行。(等待外部资源,死循环,锁)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值