理解JVM和GC

JVM

JVM内存划分?

在这里插入图片描述

程序计数器,虚拟机栈,本地方法栈,堆,和方法区
其中堆和方法区线程共享。
Java运行时的数据区包括:(其中前两个是线程共享的)

1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存
3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Frame(方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
4.本地方法栈(Native Method Stack) 与虚拟机栈了类似,不过则为虚拟机使用的到的Native方法服务。(有的虚拟机譬如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一)
5.程序计数器(Program Counter Register) 可看作当前线程所执行的字节码的行号的标识器

JVM内存溢出

答:主要是有堆内存溢出栈内存溢出,堆内存溢出可能是由于大量创建新的对象导致堆内存会溢出,栈内存溢出可能是我们死递归一个方法时导致的栈内存溢出。

类加载机制

将class文件加载到jvm方法区中,在对应堆区上创建对象,来封装方法区上的数据结构。

双亲委派模型

类加载器: 类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。

启动类加载器,扩展类加载器,应用程序类加载器。

当一个类加载器接收到加载类的指令时,会先让这个类加载器的父类加载器进行加载,如果父类加载器不能进行加载,这时才由子类加载器进行加载。
双亲委派模型的作用
保证优先加载内部基础类,避免出现了自定义类覆盖基础类的情况,提升安全。

垃圾回收机制GC

有哪些判断是否为回收对象的算法?

答:引用计数法:对一个引用对象创建一个计数器,当引用该对象时,计数器+1,释放该对象时计数器-1,当计数器为0时,可进行回收。
可达性算法:将GC roots对象作为起点,向下进行搜索,搜索路径成为引用链,如果一个对象到GC roots没有任何引用链时,GC可对该对象进行回收。

GC清除算法

1.标记-清除算法
将标记的对象直接清除,但容易产生内存碎片。
2。标记-复制(新生代回收算法)
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一
块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区
域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情
况,只需要移动堆顶指针
3。标记-整理(老年代回收算法)
标记要清除的对象后,将存活对象向内存一端进行移动,然后进行清除。

JVM有哪些垃圾回收器?他们的区别有什么?

答:新生代垃圾收集器:Serial,ParNew,Parallel Scaveng
老年代收集器:Serial Old,Parallel Old, CMS
全区收集器:G1
区别:
复制算法:Serial、ParNew、Parallel Scavenge
标记清除:CMS
标记整理:Serial Old、G1、Parallel Old

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值