范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JVM垃圾回收怎么样

  JVM 的自动内存管理,让原本应该是开发人员去做的事情,变成了垃圾回收器来做的事情
  既然是别人帮忙做的事情,那么可能就不是自己想要的,所以就需要我们了解一下垃圾回收相关的内容  引用计数法与可达性分析
  垃圾回收,垃圾回收,那就是有的内存分配给了一些对象,但是这些对象已经用完了,那么它所占用的内存也就应该该释放掉了,却还没有释放
  那么,这里就有个问题:该如何确定一个对象用完了呢?
  其中一种方法就是引用计数法
  引用计数法就是给每个对象添加一个引用计数器,来统计指向该对象的引用个数
  比如:如果有一个引用,被赋值为某一个对象,那么这个对象的引用计数器就 +1 ,如果一个指向这个对象的引用,被赋值为了其他的值,那么这个对象的引用计数器就 -1 ,这样如果这个对象的引用计数器为 0 ,我们就可以认为这个对象已经使用完毕,它所占用的内存空间可以回收掉了
  这种方案听上去无懈可击,但是有一个致命的漏洞,就是没办法处理循环引用的问题
  比如说: A 和 B 互相引用,除此之外也没有其他的引用指向 A 或者 B ,在这种情况下,其实 A 和 B 所占用的内存就可以释放掉了,但是因为它们互相都有引用,所以此时的引用计数器并不为 0 ,在这种情况下,就不能对它们进行回收
  现在只是两个对象,如果再来两个,再来两个,这样循环引用的对象多了之后,就会造成内存泄露
  基于引用计数法的弊端,当前 JVM 主流的垃圾回收器采取的是可达性分析算法
  这个算法本质就是将一系列的 GC Roots 作为初始的存活对象合集( live set ),然后从这个合集出发,探索所有能够被该集合引用到的对象,并把这些对象加入到集合中来,这个过程就叫做标记( mark ),遍历到最后,没有被探索到的对象就是可以回收的对象
  那么什么是 GC Roots 嘞?一般包括(但不限于)以下几种:  Java 方法栈桢中的局部变量  已加载类的静态变量  JNI handles  已启动并且没有停止的 Java 线程
  刚才说因为引用计数法存在循环引用的问题,所以目前主流垃圾回收器选用的都是可达性分析法,也就是说,它解决了循环引用问题,其实这一点也比较好理解,虽然 A 和 B 相互引用,但是这个时候从 GC Roots 开始出发,是没有办法到达 A 和 B 的,那么就不会把它们放到存活对象合集之中,自然也就会被回收掉
  但是在实际中还是会有问题的,比如:在多线程环境下,就会有其他线程更新已经访问过的对象中的引用,但是是多线程并行的嘛,这个时候可达性分析法已经把这个引用设置成了 null ,或者这个对象还在使用,但可达性分析法把它标记为了没有被访问过的对象,被回收掉了,这种情况可能直接导致 JVM 崩溃掉  Stop-the-world & safepoint
  既然可达性分析法也有自己的一些缺陷,总得有解决方案吧?比较暴力的一种方法就是 Stop-the-world ,估计听名字也能知道,就是让全世界都停下来,也就是说,在进行垃圾回收的时候,其他所有非垃圾回收线程的工作都需要停下来,先让垃圾回收器工作完毕再说。这就是所谓的暂停时间( GC pause )
  Stop-the-world 是通过安全点( safepoint )机制来实现的。啥意思嘞?咱先想个场景,现在你敲代码敲的特别开心,又有思路,状态又好,美滋滋的正在工作,突然毫无缘由的就让你现在不准敲代码,你会不会不开心?好不容易思路来了对吧,就一点儿理由都不给的就让我停下,不合理吧?
  同样的场景,一个线程现在跑的特别 happy ,而且再有一秒钟就完成了任务,这个时候 JVM 收到了 Stop-the-world 请求,二话不说就把所有的线程给停掉,不太好吧?那么这个时候安全点( safepoint )机制就登场了。有了安全点机制,当 JVM 收到 Stop-the-world 请求的时候,它就会等待所有的线程都达到安全点,才允许请求 Stop-the-world 的线程进行独占的工作
  那么,什么时候是安全点呢?举个例子来说:当 Java 程序通过 JNI 执行本地代码时,如果这段代码不访问 Java 对象,不调用 Java 方法,不返回到原 Java 方法,那么 Java 虚拟机的堆栈就不会发生改变,那这段本地代码就可以作为一个安全点。只要不离开这个安全点, JVM 就可以在垃圾回收的同时,继续运行这段本地代码
  因为本地代码需要通过 JNI 的 API 来完成上述三个操作,因此 JVM 只需要在 API 的入口处进行安全点检测( safepoint poll ),看看有没有其他线程请求停留在安全点这里,就可以在必要的时候挂起当前线程  垃圾回收的三种方式
  当标记好存活的对象之后,就可以进行垃圾回收了
  主流的垃圾回收方式,可以分为三种:清除( sweep ),压缩( compact ),复制( copy )
  清除,就是把死亡对象所占据的内存标记成空闲内存,并把它记录在一个空闲列表( free list )中,当需要新建对象的时候,就直接在空闲列表中寻找空闲内存,划分给新建的对象就完了
  但是这里会产生一个问题,因为死亡的对象所占据的内存可能是随机的,回收完毕之后,内存就是碎片化的,如果此时有对象申请一块连续的内存空间,尽管碎片化的内存空间是够用的,也没办法进行分配
  压缩,就是把存活的对象聚集到内存区域的起始位置,这样就可以留下一段连续的内存空间。这样去做的话,可以解决内存碎片化的问题,代价就是压缩算法带来的性能开销
  复制,就是把内存区域分成两等分,分别用两个指针 from 和 to 来维护,并且只是用 from 指针指向的内存区域来分配内存。当进行垃圾回收时,就把存活的对象复制到 to 指针指向的内存区域中,并且交换 from 指针和 to 指针的内容。
  复制这种方式也可以解决内存碎片化的问题,但是它的缺点也是比较明显的,因为把内存区域分成了两等分嘛,那利用率就比较低咯,最高也是 50% 了,不能再高了  垃圾回收在 JVM 中的应用
  上面说的三种垃圾回收方式是理论上的,那么在 JVM 中是如何应用的呢?
  这就先要来了解下 JVM 的堆划分,大概就是这样子:
  JVM 将堆划分为新生代和老年代,在新生代中又划分为 Eden 区,还有两个大小相同的 Survivor 区
  当程序调用 new 指令时,会在 Eden 区中划出一块作为存储对象的内存,但是因为堆空间是线程共享的,所以在这里面划分空间的话就需要同步,要不然出现了两个对象共用一段内存,那不就该打架了嘛
  JVM 为了避免两个对象打架的事情发生,就让每个线程向 JVM 申请一段连续的内存,来作为线程私有的 TLAB ( Thread Local Allocation Buffer ,对应虚拟机参数  -XX:+UseTLAB  ,默认开启的)
  Eden 区一直进行分配,总有空间分配完毕的时候,该怎么办?此时 JVM 就会触发一次 Minor GC ,来收集新生代的垃圾,存活下来的对象就会被送到 Survivor 区
  在图中可以看到, Survivor 区有两个,一个是 from ,一个是 to ,其中 to 指向的 Survivor 区是空的
  当发生 Minor GC 时, Eden 区和 from 指向的 Survivor 区中的存活对象会被复制到 to 指向的 Survivor 区,然后交换 from 和 to 指针,这样就保证了下一次 Minor GC 时, to 指向的 Survivor 区还是空的
  同时 JVM 会记录 Survivor 区的对象一共被来回复制了几次,如果一个对象被复制的次数为 15 (对应虚拟机参数  -XX:+MaxTenuringThreshold  ),这个对象就会被晋升( promote )到老年代
  那么在发生 Minor GC 时,采用哪种垃圾回收方式会比较好一些呢?采用复制方式,也就是 标记-复制 算法会好一些。为什么呢?因为在新生代中,大部分的 Java 对象只存活一小段时间,那么我们就可以采用耗时比较短的垃圾回收算法,让大部分的垃圾都能在新生代被回收掉。使用 标记-复制 算法的话,理想情况下就是 Eden 区中的对象基本都死亡了,那么需要复制的数据非常少,此时这种算法的优势就被极大的体现了出来

大疆官宣11月2日发布新品,Mavic3Classic青春版无人机将至大疆官方微博宣布将于11月2日下午,在深圳宝安机场举办新品发布会,新品包括全新Mavic3Classic青春版无人机,全新Mavic3ProUltra2VRMavicSpace以及80的芯片从国外进口,大疆无人机要有危机感近日,日本一个专业拆解团队在拆掉一个大疆无人机的DJIMavicAir2之后,发现了大疆的芯片短板问题里面的芯片80几乎都来自于国外,尤其是美国科技公司的芯片占比最大。在日本人看来三年行动冲刺收官国企布局优化步伐加快新华社作者王璐经济参考报10月28日刊发文章三年行动冲刺收官国企布局优化步伐加快。文章称,2022年是国企改革三年行动的收官之年,这场大考即将响铃收卷。经济参考报记者了解到,当前众武隆乌江边上超级工程,危岩治理加固山体,好坏不用说争议挺大武隆是直辖市重庆的下辖区,地处重庆城区东南部,大娄山和武陵山的峡谷地带,乌江下游,是重庆市的旅游大区,旅游资源尤为丰富,世界自然遗产仙女山都在其境内,尽管如此,最近武隆走红,不是因今日起至10月30日期间,本市部分道路采取临时交通管制措施据市公安局消息,2022上海赛艇公开赛将于2022年10月29日至10月30日在本市举行。为确保比赛的安全顺利进行,根据中华人民共和国道路交通安全法的有关规定,市公安局决定于10月几个月大的宝宝有必要做神经心理发育检查吗?是什么?神经心理发育其实就是五大智能。1。大运动主要是指头颈部驱干和四肢做幅度比较大的动作。2。精细动作是指手和眼睛配合的动作,比如堆积木折纸用筷子画人像等。3。适应能力主要是指儿童对外界直播带货电商的路,走歪了专家建议关闭近日,传闻某头部主播李某某双11预售,直播间一晚收入佣金40亿,不过却没有听闻哪家企业出来领这份巨大营业额之后的利润而欢呼。几年时间发展,网络经济造成主播个人财富暴增,电商蓬勃发展中山能钓鱼(野钓)能溜娃能看海还能吃海鲜的地方就在这里大家好,我是香山君。今天,给大家介绍一个既能钓鱼,又能溜娃,还能看海,更能吃到美食的好地方。钓鱼人想钓鱼,又找不到一个好地方溜娃的人想钓鱼,可钓鱼的地方不能兼顾溜娃。怎么办?今天推今冬国际航班量同比翻倍,商务人员来华利好频出,机票搜索量大增中国民航将自2022年10月30日至2023年3月25日执行202223年冬春航季航班计划,其中国际航线航班方面,国内外航空公司每周安排客运航班840班,也就是420个往返航班,同残雪凝辉。哈尔滨百年江湖采菊东篱下,悠然见南山。,是魏晋时期陶渊明的一句著名诗句。我很佩服诗人物我两忘,悠然自得的心境。这个见字用得很妙,表现了一种不经意的心态,如果换成望字,那就比较刻意了,南山无论有多你升级5G套餐了吗?恭喜你被忽悠了,人民网痛批5G套路你升级5G套餐了吗?恭喜你被忽悠了,人民网痛批5G套路!三年前,工信部宣布5G商用正式启动,国内的三大运营商马上跟紧脚步,当天就公布了相应的5G商用套餐。至今为止,5G存在我们生活
阿胶是补血神器,还是智商税?红枣红糖水真的可以补血吗在我们身边有很多人都有购买阿胶的经历,在很多人眼中,阿胶是补血神器,女性又是容易贫血的人群,所以阿胶受到很多女性的欢迎,但是也有人认为阿胶价格贵,而且不补血,纯粹是交智商税。那么阿黑帮录艳照门与黑道追杀令二本世纪初的香江娱乐圈,可以说是两分天下一个是深耕电影界多年的向老板,一个是新入局的资本大鳄杨老板,向老板在圈内人脉丰厚是当之无愧的大佬级人物,杨老板虽然财雄势大,许多老牌明星却并不14天到月球,61天到火星!科幻片中的太空电梯2035年有望成真?电梯大家都坐过吧,但你有没有坐过直冲云霄,甚至可以一键直达太空的电梯?如果真有这样的太空电梯,那其被称为现实版的通天塔可以说毫不为过。注意,这可不是小说里才会有的情节,日前,在刚刚引领精品微型车潮流,奇瑞无界Pro够硬核吗?当众多玩家加速涌入新能源汽车赛道,这个前景无限的行业正在逐步变得越发拥挤,车企纷纷通过差异化来俘获更多年轻用户青睐。目前国内的新能源汽车日常依旧呈现出两级分化属性,高端市场利润虽高冬天补油肌肤更通透!郑明明凝时抗皱胶囊精华油怎么样?最近两年来护肤精华油也越来越多人用,不管是大热的夏季还是干冷的秋冬用油的人群依旧只增不减。当然精华油在使用上是不挑季节的,考虑到它强大的润泽补水效果,秋冬一定是使用高峰了。比起精油战痘宣颜丨喝水与保养肌肤的关系喝水对人体有什么作用?一项研究表明人体每天喝的水占体重的4050。但随着年龄增长,人体内液体质量的下降,水分摄入量下降,皮肤细胞处于极度缺水状态,会加速皮肤老化,形成皱纹和色斑。人写给我最爱的某人无论何时,你始终是我爱之如初,情深依旧的人写给最爱的某人无论何时,你始终是我爱之如初,情深依旧的人多少往事被时光埋葬,多少期待成了遥不可及的梦,多少无话不说的人,成了最熟悉的陌生人!比如我和你,曾经那么相爱,现在,却只剩下某商银行,真的是抽贷之王吗?大数据是如何调整贷款额度的?其实所有的互联网贷款,大致的营销套路都是这样的。他们都是利用用户的不断更新的数据,去对照金融机构内部构建的大数据系统。然后对于用户的授信额度以及利率进行不断灵活的动态调整。只不过某运营商自研小基站,京信通信资本之路还好走吗?近日,通信与信息解决方案和服务提供商京信通信再次进行了一个新的资本动作。在11月15日晚发布公告称,准备以介绍的方式在新加坡证券交易所上市。若京信通信在新加坡第二上市完成,京信通信传闻华为P60系列明年初发布,独享8Gen24G版配鸿蒙OS3。1众所周知,根据华为迭代更新策略,华为P60系列将是华为Mate50系列之后的下一款旗舰。近日,数码博主厂长是关同学爆料称,华为P60系列已经基本确定,该系列有机会搭载华为鸿蒙OS3WalletCEX和DAPP,谁才是Web3未来的流量入口?一入口的发展历史当前Web3行业整体暂时处于发展的早期,和传统的Web2行业相比,流量的攫取还暂时处于较为原始的阶段,通常以一种较为粗犷的方式进行。随着Web3行业的发展,我们按用