JVM-优化4

对于JVM调优
优先级最高的–代码层面(如HashMap初始化的值

/**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

为什么不直接写16?
因为写1向左4位执行效率更高。转化为字节码文件后,执行指令时将会简化。

性能优化(OOM,GC,CPU使用过高)
OOM
秒杀场景
如图的秒杀场景,所给3台服务器只能满足40s的并发
处理方式:将young区内存扩大,old区减小,使其减少oldGC,满足60s内的并发。(但这样会影响系统停顿时间)
同时可以在客户端就进行限流(如设置验证码,只能点击一次等),使达到服务器的访问量减少。

在这里插入图片描述

面试题:一定不能调整新老年代的比例

(1)内存泄漏和内存溢出的区别?
内存泄漏:是指不再使用的对象无法得到及时的回收,持续占用内存空间,从而造成内存空间的浪费。
内存溢出:所创建对象没有足够的内存空间存放了。
内存泄漏的堆积容易导致内存溢出,但内存溢出不一定是内存泄漏导致的。

(2)young gc会有stw吗?
不管什么GC,都会发生stop-the-world,区别是发生的时间长短。而时间长短与垃圾收集器有关系,Serial,PartNew,Paeallel Scavenge收集器无论是串行还是并行,都会挂起用户线程,而CMS和G1在并发标记时,是不会挂起用户线程的,但其他时候一样会挂起用户线程,stop the world的时间相对就小很多。

(3)major gc和full gc的区别
Major GC在很多资料中是等价于Full GC的,很多性能监测工具中只有Minor GC和Full GC。一般情况下,一次Full GC 将会对年轻代,老年代,元空间以及堆外内存进行垃圾回收。
触发Full GC的原因有很多:当年轻代晋升到老年代的对象大小,比目前老年代的剩余空间大小还要大时,就会触发Full GC;当老年代的空间使用率超过某阈值时,也会触发Full GC;当元空间不足时(JDK1.7永久代不足),也会触发Full GC;当调用System.gc()也会安排一次Full GC。

(4)什么是直接内存
Java的NIO库允许Java程序使用直接内存。直接内存是Java堆外的,直接向系统申请的内存空间。通常访问直接内存的速度会优于Java堆。因此出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。由于直接内存在Java堆外,因此它的大小不会直接受限于XMX指定的最大堆大小,但是系统内存的有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

(5)垃圾判断的方式
引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为0就会回收,但是JVM没有用这种方法,因为无法判断相互循环引用(A引用B,B引用A)的情况。
引用链法:通过一种GC ROOT的对象(方法区中静态变量引用的对象等-static变量)来判断,如果有一条链能够到达GC ROOT就说明不能回收,不能达到GC ROOT就说明可以回收。

(6)不可达的对象一定要被回收吗?
即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;可达性分析中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize方法。当对象没有覆盖finalize方法,或finalize方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。
被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会真的回收。

(7)为什么要区分新生代和老年代?
当前虚拟机的垃圾收集都采用分代收集算法,这种算法只是根据对象存活周期的不同将内存分为几块。一般将Java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择贺是的垃圾收集算法。
如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活率比较搞,而且没有额外的空间对它们进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

(8)方法区中的无用类回收
方法区主要回收的是无用的类,那么如何判断一个类是无用的类呢?
判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。
需要同时满足下列3个条件才能算“无用类”:
1.该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例。
2.加载该类的ClassLoader已经被回收。
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值