面试知识点(第四弹:JVM)

垃圾回收算法

引用计数

基本原理

给每个对象分配一个计数器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计数器为0时,java垃圾回收器会认为该对象是可回收的。

优点

  1. 实时性:无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否为0,就可以直接回收。
  2. 应用无需挂起:在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不足,则立刻报outofmemory错误。
  3. 区域性:更新对象的计数器时,只是影响到该对象,不会扫描全部对象

缺点

  1. 每次对象被引用时,都需要去更新计数器,有一点时间开销。
  2. 无法解决循环引用问题。例如:
class A{
    public B b;
}
class B{
    public A a;
}
public class Main{
    public static void main(String[] args){
        A a = new A();
        B b = new B();
        a.b=b;
        b.a=a;
        a = null;
        b = null;
    }
}

虽然a和b都为null,但是由于a和b存在循环引用,这样a和b永远都不会被回收。
3. 浪费cpu,即使内存够用,仍然在运行时进行计数器的统计。

根搜索

基本原理

定义一系列名为GC Roots的对象作为起点,从起点向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连,则说明该对象不可用,这时Java虚拟机可以对这些对象进行回收。

哪些对象定义为 GC Roots

  1. Java虚拟机栈中引用的对象:比如方法里面定义这种局部变量 User user= new User();
  2. 静态属性引用的对象:比如 private static User user = new User();
  3. 常量引用的对象:比如 private static final User user = new User();
  4. 本地方法栈中引用的对象

JVM常见参数调整

-Xms100M 堆的初始大小
-Xmx500M 堆的最大值
-XX:NewRatio=2 新生代和老年代大小的比值
-XX:SurvivorRatio=8 伊甸园和幸存区大小的比值
-XX:MaxPermSize=200M 最大永久代的内存
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump 内存溢出的时候把dump文件生成到某路径

jprofiler,jvisualVM工具的使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值