JVM与GC学习总结

1 篇文章 0 订阅

                                       

程序计数器: 线程私有,占用内存空间小,不产生垃圾回收,其本质是一个当前线程所执行字节码的行号指示器,
字节码解释器通过改变行号指示器的值,去完成程序中的循环,判断,异常处理,线程恢复等...

java虚拟机栈:线程私有,不产生垃圾回收,生命周期随着线程的创建而创建,线程销毁则销毁;每个方法被执行
都会创建一个栈帧,用于存储局部变量表、操作栈、方法出口等信息;一个方法开始到结束,就对应这一个栈帧从
入栈到出栈的过程,
    ps:局部变量表中存储8大基本类型和对象的引用
    
java本地方法栈:其作用和java虚拟机栈类似,但是java虚拟机栈主要为java方法服务,而java本地方法栈主要是
服务于虚拟机所使用到的Native方法

方法区:线程共享,主要存储已经被虚拟机加载的类信息、常量、静态变量,会产生GC

堆区:线程共享,虚拟机启动时创建,主要存放对象实例,对象的每个实例都在堆区中有独立的空间,会产生GC,使
用分代回收算法,可分为3块,新生区,养老区,元空间;新生区分为3块,Eden 区,Survivor from区,Survivor to
区三块空间在Eden区占有的空间份额为8:1:1;当空间被对象填满之后,各个空间有各自的垃圾回收算法清理被占用的
空间;

当java程序new出来一个对象发生了什么

Object obj = new Object();

首先我们的方法区中是有Object.Class这个已经被编译好的类的,Object obj左边部分为对象的引用,保存在java虚拟机
栈的本地变量表中,new Object 保存在堆中,被称为对象的实例数据,每一个对象的实例数据在对空间中都有一块独立的
空间保存实例数据以及指向Object.Class的指针。

java 类加载器有4个  bootStrap(启动类)加载器,Extension(扩展)加载器,AppClass(系统)加载器,用户自定义加载器,
其中bootstrap加载器是嵌套在java虚拟机内核里面的,jvm启动的时候BootStrap加载器就已经启动了;

1、双亲委派机制:java某一个特定的类加载器收到加载类的请求后,会先把这个请求委托各父类加载器去加载,依次递归,当
父类加载器无法加载这个类时才自己加载;
使用此机制原因是为了防止被加载类出现两份字节码,譬如有两个类A,B同时加载一个类C,那么在内存中就存在了两份字节码,
使用双亲委派机制如果在A,B的父加载器加载到C直接返回C就好了,这样就不会产生两份字节码。

类被实例化后存放在堆区此时产生GC目前使用的GC算法为:分代回收算法
垃圾回收算法一般分为四种:
1、引用计数法
    对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用
    计数器的值为0,则对象A就不可能再被使用
    缺点:引用和去引用耗时,影响性能
          循环引用难以处理
2、复制算法:
    主要发生新生区中,当java对象把新生区空间沾满后会触发young Gc,此时销毁Eden区和Survivor from区所有对象,如果对象
    正在被引用则复制对象到 Survivor to区,复制的对象年龄+1,之前的Survivor to变成Survivor from,之前的Survivor form 
    被清空,变成Survivor to去,当对象的年龄大于15时,复制对象到养老区,
    优点:效率高
    缺点:Survivor from 和 Survivor to区 需要分配相同大小的内存,当存活的对象少的时候,会造成不必要的内存浪费
    
3、标记清除:主要用在养老区,其做法是先将需要回收的对象进行标记,等标记完成后会对所标记的对象进行回收
    优点:节约内存
    缺点:两次扫描,耗费一定的时间,产生很多内存碎片
4、标记整理算法:主要在养老区,对不被使用的对象进行标记,并将其移动到一端,然后在边界外在对要回收的对象进行GC
    优点:不会产生内存碎片
    缺点:比较耗时

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值