JVM调优总结(3):垃圾回收面临的问题

如何区分垃圾

 

上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

 

 

同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。

 

因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器…)。而最简单的Java栈就是Java程序执行的main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式

 

如何处理碎片

 

由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。

 

如何解决同时存在的对象创建和对象回收问题

 

垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解决二者矛盾的方式。

 

但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处理能力也会相应降低,同时,“碎片”问题将会比较难解决。

转载于:https://www.cnblogs.com/jxhd1/p/6547607.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RoHS、无铅制程、无卤 的基本介绍

一、RoHS是欧盟对电子电器产品不能超标含有某些有害物质的禁令;在具体产品生产中,从原材料的选择、采购到制程中可能会污染产品(和产品接触)的生产辅助材料,都必须不能超标含有(有最大允许浓度)…

springCloud分布式事务实战(九)改造ThemeMicroService 支持分布式事务

&#xff08;1&#xff09; 添加jar <!-- springCloud 事务 关键点1 --><dependency><groupId>com.codingapi</groupId><artifactId>transaction-springcloud</artifactId><version>${lcn.last.version}</version><exclu…

日常的一天学习

今天的学习仍然没有特别明确的计划&#xff0c;也许自己不应该再徘徊&#xff0c;专心做java编程挺好的啊&#xff0c;也许还能找到不错的工作&#xff0c;可是自己始终还是想成为一个研究安全的人&#xff0c;只是不知道自己在毕业的时候能不能成长到靠安全来养活自己。 早上主…

庖丁解牛-----Live555源码彻底解密(根据MediaServer讲解Rtsp的建立过程)

live555MediaServer.cpp服务端源码讲解(testRelay.cpp,http://blog.csdn.net/smilestone_322/article/details/18923139) int main(int argc, char** argv) { // Begin by setting up our usage environment: TaskScheduler* scheduler BasicTaskScheduler::createNew(); Usa…

运放搭建主动滤波电路

主动低通滤波电路 R1R216K R3R4100K C1C20.01uF 放大倍数AvR4/(R3R4) Freq1KHz 主动高通滤波电路 C12*C20.02uF,C20.01uF R1R2110K 6dBLow-cutFreq100Hz

deployd使用

安装node,用npm 安装deployd , npm install deployd -g。 cd进入文件夹&#xff0c;输入 dpd create deploydDemo&#xff0c;然后 dpd -p 5500 deploydDemo\app.dpd&#xff08;5500是你开启的mongodb创建的服务&#xff09;&#xff0c;接着在浏览器中输入 http://localhost:…

android自定义布局实现优惠券效果

最近需要实现一个凹凸效果的拟物化优惠券效果&#xff0c;我一看&#xff0c;本来想用.9图片做背景实现的&#xff0c;虽说图片做背景实现省事儿方便&#xff0c;但是能用代码实现最好不过了&#xff0c;最终我还是选择了用代码来实现&#xff0c;于是有了下文。 最终效果图 de…

邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

好了&#xff0c;进入这个系列教程最主要的步骤了&#xff0c;前面邮件的理论知识我们都了解了&#xff0c;那么这篇博客我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛&#xff0c;比如注册需要发送邮件进行账号激活&#xff0c;再比如OA项目中利用邮件进行任务提…

运放搭建电压电流转换电路分析

如下图电路&#xff0c;电流可以转换成电压&#xff0c;电压也可以转换成电流&#xff1b; 根据虚断&#xff1a;(Vi–V1)/R2 (V1–V4)/R6 &#xff08;a&#xff09; 同理 (V3–V2)/R5V2/R4 &#xff08;b&#xff09; 根据虚短&#xff1a; V1V2 &#xff08;c&#xff09…

centos7装完chrome无法使用yum问题解决

2019独角兽企业重金招聘Python工程师标准>>> 续前文装好chrome后&#xff0c;yum居然用不了&#xff0c;提示错误“Basic XLib functionality test failed!” 呵呵。。。呵呵了.... 【题外话~个人真心觉得pythonseleniumchrome在linux环境下开发和使用 简直蛋疼无比…

实验二第二部分

第二部分 FTP协议分析 1. 两个同学一组&#xff0c;A和B。 2.A同学架设FTP服务器&#xff0c;并设置用户名和密码&#xff0c;例如gao / gao 3.B同学在机器中安装Wireshark&#xff0c;并将其打开&#xff1b;之后用用户名和密码登陆A同学的FTP服务器&#xff0c;并上传一张图片…

运放搭建的跟随电路作用与分析

电压跟随器&#xff0c;顾名思义就是输出电压与输入电压是相同的&#xff0c;就是说电压跟随器的电压放大倍数恒小于且接近1。 电压跟随器的显著特点就是&#xff0c;输入阻抗高&#xff0c;而输出阻抗低。 根据其显著特点&#xff0c;常见的作用如下&#xff1a; 1- 缓冲 在…

Spring Boot(十二)单元测试JUnit

一、介绍 JUnit是一款优秀的开源Java单元测试框架&#xff0c;也是目前使用率最高最流行的测试框架&#xff0c;开发工具Eclipse和IDEA对JUnit都有很好的支持&#xff0c;JUnit主要用于白盒测试和回归测试。 白盒测试&#xff1a;把测试对象看作一个打开的盒子&#xff0c;程序…

介绍TCP/udp比较好的博客

http://blog.csdn.net/nana_93/article/details/8743525

Kubernetes容器上下文环境

目录贴&#xff1a;Kubernetes学习系列 下面我们将主要介绍运行在Kubernetes集群中的容器所能够感知到的上下文环境&#xff0c;以及容器是如何获知这些信息的。 首先&#xff0c;Kubernetes提供了一个能够让容器感知到集群中正在发生的事情的方法&#xff1a;环境变量。作为容…

Shell-脚本只能运行1次

用空文件进行判断 pathpwd if [ -f ${path}/.runned ]; then {echo "This script can only execute once! You have runned it!"exit } elsetouch ${path}/.runned fi 转载于:https://www.cnblogs.com/music378/p/7677648.html

运放电压跟随电路应用

电压跟随器的显著特点&#xff1a;输入阻抗高&#xff0c;输出阻抗低。 如下所示为利用放大器搭建的电压跟随电路&#xff0c;方便测量电压大小&#xff1a; 此电路目的是测量电池电压&#xff0c;电池电压范围&#xff08;3~4.2V&#xff09;分压后最大电压为2.1V 属于3.3V电…

Mac与Phy组成原理的简单分析

Mac与Phy组成原理的简单分析 2011-12-28 15:30:43 //http://blog.chinaunix.net/uid-20528014-id-3050217.html 本文乃fireaxe原创&#xff0c;使用GPL发布&#xff0c;可以自由拷贝&#xff0c;转载。但转载请保持文档的完整性&#xff0c;并注明原作者及原链接。内容可任意使…

[BZOJ3994][SDOI2015]约数个数和

3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1104 Solved: 762 [Submit][Status][Discuss]Description 设d(x)为x的约数个数&#xff0c;给定N、M&#xff0c;求 Input 输入文件包含多组测试数据。 第一行&#xff0c;一个整数T&#xff0…

月蚀动漫获快看漫画600万元A轮战略投资,走国漫精品化路线

11月5日消息&#xff0c;月蚀动漫宣布获得快看漫画600万元A轮战略投资。 据了解&#xff0c;月蚀动漫曾于2017年1月获得原力创投的百万级种子轮投资&#xff0c;2018年1月获得英诺天使基金的百万级天使轮投资。 据月蚀动漫创始人贺小桐透露&#xff0c;团队能在行业寒冬期获得…