jvm原理

一、类加载

1、启动类加载器
扩展类加载器
应用类加载器:用户自定义类加载

2、双亲委派:比如用户自定义类加载的时候会向上级去请求,一直到启动类加载器加载,如果启动类加载器不能完成加载任务,就还是交给第一个请求的类加载加载(这里是应用类加载器)。这样做的好处是,同一个类被不同类加载器加载之后,并不是同一个类了,会造成对这些类管理的杂乱,而如果都由启动类加载器的java.lang.Object类生成的在同一个Object下都是同一个类,便于管理。

二、gc垃圾回收

(参考 https://www.sohu.com/a/235928510_100123073)

三个角度来了解gc:
1jvm怎么确定哪些对象应该进行回收 ?
对象是否会被回收的两个经典算法:
引用计数法(未被引用,如果是循环引用,就不能解决这个问题,比如a,b,a中调用b,b调用a)
*可达性分析算法(虚拟机中用的是有向图,程序把所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。 如图:)

2jvm会在什么时候进行垃圾回收的动作 ?
答:1会在cpu空闲的时候自动进行回收  2在堆内存存储满了之后  3主动调用System.gc()后尝试进行回收

3jvm到底是怎么清除垃圾对象的?
算法又有四个:标记-清除算法 ,复制算法 ,标记-整理算法 ,分代收集算法(新生代,老年代,永久代(1.8及以后叫做元数据区))

1、System.gc()和Runtime.gc()会做什么事情?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。

2、但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。
3、.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值