JAVA异常及GC处理机制相关问题

在JAVA异常处理机制中,什么时候抛出异常?什么时候捕获异常?

异常想当于一种提示,相当于告诉上层方法我抛出了一个异常我处理不了,交给你来处理,而对于上层来说,也需要决定自己能不能处理这种异常,是否要抛给上一级。

所以对于一个方法而言,我们要考虑的是本方法能不能合理的处理这种异常,如果不能就继续向上抛出异常,包括在本方法调用另一个方法时,发现了异常,如果这个出现了异常,则且需要自己来处理,则捕获该异常来进行处理。

JAVA中有哪些类加载器?

JDK自带三个类加载器:bootStrapClassLoader,ExtClassLoader,AppClassLoder

BootStrapClassLoader:是ExtClassLoader的父类加载器,负责加载%JAVA_HOME%lib文件下的jar包和.Class文件。

ExtClass Loader:是AppClassLoader的父类加载器,默认加载%JAVA_HOME%lib/text下的jar包和.class文件。

AppCLassLoader:是自定义类加载器的父类,负责加载classPath的文件。

类加载器的双亲委派模型:

JVM三个默认类加载器:

JVM加载一个类时,会调用AppClassLoder的loadclass方法加载这个类,不过在这个方法中会先使用ExtClassLoder方法来加载类,同样在ExtClassLoader的LoaderClass方法会先执行。

BootStrapClassLoader来加载类,如果加载到了直接成功,否则ExtClassLoder就会自己尝试加载类,如果没有,则会由AppClassLoder来加载类。

双亲委派指的是:JVM在加载类时,会委派给ExtCLassLoder和BootStrap CLass Loder加载,不成功则给自定义类加载器加载。

JVM哪些是线程共享区?
堆区和方法区是线程共享的,栈,本地方法栈和程序计数器是每个线程独有的。

JVM项目如何排查问题?

对于正常运行系统:

1:可以使用Jmap来查看JVM中各个区域中的使用情况;

2:可以通过stack来查看线程使用情况,比如那些线程阻塞,是否发生死锁......

3:可以通过Jstat命令来查看垃圾回收的情况,特别是Full GC,如果发现FullGC比较频繁,就得调优了。

4:通过各个命令的结果,或者jvisualvm等工具来进行分析。

5:首先,初步猜测频繁发送Full GC的原因,如果频繁发生Full GC但又没有内存泄漏,表示full GC回收很多对象,所以这些对象最好在youngGC过程直接回收,避免这些对象进入老年代,对于这种情况,就得考虑这些对象是否比较大,导致年轻代放不下,直到进入老年代,尝试加大年轻代的大小,如果改完之后,FullGC减少,则修改有效。

6:找到占用内存最多的线程,定位到具体的方法,优化这个方法的执行,看能否避免某些对象的创建,从而节省内存。

对于已经发生OOM的系统

1:一般发生OOM时,会生成当时的dump文件。

2:我们可以利用Jsisualvm等工具来分析dump文件。

3:根据dump文件找到异常的实例对象和异常的线程,定位到具体的代码。

4:在进行详细的分析和调试。

调优步骤:

分析->推理->实践->总结分析->定位具体问题

一个对象从加载到JVM,再到被GC清除,都经历了什么过程?

1:首先把字节码文件加载到方法区;

2:然后根据类信息创建对象。

3:对象首先会分配在堆区中年轻的Eden区,经过一次MinorGC后,对象如果存活,就会进入Suvivior区后,在连续的每次MinorGC中,如果对象一直存活,就会在survivor中来回拷贝,每次年龄加1。

4:当年龄超过15后,对象仍然存活,则会进入老年代。

5:如果进入fullGC,被标记为垃圾对象,那么就会被GC线程清理掉。

怎么确定一个线程是不是垃圾?

1:引用计数法:堆内存给每个对象一个引用计数,在老版本JDK中,如果引用个数为0,则被认为是垃圾。

2:可达性算法:在内存中,从根对象向下一直引用,找到的对象就不是垃圾,没找到的就是垃圾。

JVM有哪些垃圾回收算法?

1:垃圾清除算法:

a:标记阶段:把垃圾在内存中标记出来。

b:清除阶段:直接将垃圾在内存中回收

这种算法比较简单,但是会产生大量内存碎片。

2:复制算法:为了解决清除算法的内存碎片问题,产生了复制算法,将内存分为大小相等的两半,每次只使用一半,垃圾回收时,将当前这一块对象复制到另一块,然后这一半直接清除,这种算法没有内存碎片,但是消耗内存,空间浪费。效率与存活对象个数有关。

3:标记压缩法:为了解决复制算法的问题,就提出了标记压缩算法,这种算法在标记阶段和标记清除算法是一样的,标记出垃圾对象,然后将存活对象往一段移动,然后将边界以外的(垃圾)全部清除。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗着,享受着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值