Java_垃圾回收机制(未掌握)
垃圾回收机制
任何一种垃圾回收算法一般要做两件基本事情:
- 发现无用的对象(没有任何变量引用该对象)
- 回收无用对象占用的内存空间
垃圾回收相关算法: 引用计数法, 引用可达法
分代垃圾回收机制: 不同的对象的生命周期是不一样的. 因此, 不同生命周期的对象可以采用不同的回收算法, 以便提高回收效率. 将对象分为三种状态: 年轻代, 年老代, 持久代. JVM虚拟机将堆划分为Eden, Survivor和Tenured/Old空间
年轻代
所有新生的对象首先是都放在Eden区. 年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象, 对应的是Minor GC, 每次Minor GC会清理年轻代的内存, 算法采用效率较高的复制算法, 频繁的操作, 但是会浪费内存空间. 当"年轻代"区域存放满对象后, 就将对象放到年老代区域.
年老代
在年轻代中经历了N(默认15)次垃圾回收后仍然存活的对象, 就会放到年老代中. 因此, 可以认为年老代中存放的都是一些生命周期较长的对象. 年老代对象越来越多, 我们就需要启动Magor GC和Full GC(全量回收), 来一次大扫除, 全面清理年轻代区域和年老代区域
持久代
用于存放静态文件, 如Java类, 方法等. 持久代堆垃圾回收没有显著影响
Minor GC: 用于清理年轻代区域. Eden区满了就会触发一次Minor GC.清理无用对象, 将有用对象复制到"Survivor1", "Survivor2"区中(这两个区大小相同, 同一时刻两者只有一个在用, 另一个为空)
Major GC: 用于清理年老代区域
Full GC: 用于清理年轻代, 年老代区域. 成本较高, 会对系统性能产生影响
垃圾回收过程:
- 新创建的对象, 绝大多数都会存储在Eden中
- 当Eden满了(到达一定比例)不能创建新对象, 则触发垃圾回收(GC), 将无用对象清理掉, 然后剩余对象复制到某个Survivor中, 同时清空Eden区
- 当Eden区再次满了, 会将Survivor中不能清空的对象存到另一个Survivor中
- 重复多次(默认15次)Survivor中没有被清理的对象, 则会复制到年老代Old(Tenured)区中
- 当Old区满了, 就会触发一个一次完整的垃圾回收(Full GC), 之前新生代的垃圾回收称为(minor GC)
垃圾回收机制关键点:
垃圾回收机制只回收JVM堆内存里的对象空间
对其他物理连接, 比如数据库连接, 输入流输出流, Socket连接无能为力
现在的JVM有多种垃圾回收实现算法, 表现各异
垃圾回收发生具有不可预知性, 程序无法精确控制垃圾回收机制执行
可以将对象的引用变量设置为null, 暗示垃圾回收机制可以回收该对象
程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收, 会有一些效果, 但是系统是否进行垃圾回收依然不确定
垃圾回收机制回收任何对象之前, 总会先调用它的finalize方法(如果覆盖该方法, 让一个新的引用变量重新引用该对象, 则会重新激活对象)
永远不要主动调用某个对象的finalize方法, 应该交给垃圾回收机制调用
易造成内存泄漏的操作
创建大量无用对象
如在需要大量拼接字符串时, 使用String而不是StringBuilder
String str = --;
for(int = 0; i < 10000; i++) {
str += i; // 相当于产生了10000个String对象
}
静态集聚合类的使用
像HashMap, Vector, List等的使用最容易出现内存泄漏, 这些静态变量的生命周期和应用程序一致, 所有的对象Object也不能被释放
各种连接对象(IO流对象, 数据库连接对象, 网络连接对象)未关闭
IO流对象, 数据库连接对象, 网络连接对象等连接对象属于物理连接, 和硬盘或者网络连接, 不使用是一定要关闭
监听器的使用
- 程序员无权调用垃圾回收器
- 程序员可以调用System.gc(), 该方法只是通知JVM, 并不是运行垃圾回收器. 尽量少使用, 会申请启动Full GC, 成本高, 影响系统性能
- finalize方法, 是Java提供给程序员来释放对象或资源的方法, 但是尽量少使用
Java_垃圾回收机制(未掌握)的更多相关文章
- Java内存分配及垃圾回收机制(未完待待续)
Java内存区域 1.内存区域 jvm运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 方法区 Java堆 大图 2.概念解释 程序计数器 线程私有的一块很小的内存空间,它是当前线程所执行 ...
- 【Java_基础】JVM内存模型与垃圾回收机制
1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...
- .net垃圾回收机制编程调试试验
1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...
- java垃圾回收机制
1 .垃圾回收机制(GC)垃圾回收就是回收内存中不再使用对象:(1)垃圾回收的步骤:1)查找内存中不再使用的对象:2)释放这些对象所占用的内存:(2)查找内存中不再使用的对象方法:1)引用计数法如果一 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- Python的垃圾回收机制
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- Java Garbage Collection基础详解------Java 垃圾回收机制技术详解
最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
随机推荐
- Vue:Vue-Cli 实现的交互式的项目脚手架
一.这份文档是对应 @vue/cli.老版本的 vue-cli 文档请移步https://github.com/vuejs/vue-cli/tree/v2#vue-cli-- Vue CLI 是一个基 ...
- gitlab-配置邮件
一:配置邮件 1. 进入配置文件,通过修改/etc/gitlab/gitlab.rb来设置邮件功能 修改后的文件 1 ## GitLab URL 2 ##! URL on which GitLab ...
- S3C6410中断系统
S3C6410的中断主要改进是. 增加中断向量控制器,这样在S3C2440里需要用软件来跳转的中断处理机制,在S3C6410完全由硬件来跳转.你只要把ISR地址是存在连续向量寄存器空间,而不是象S3C ...
- logback.xml demo
如何关闭 org.apache.zookeeper.clientcnxn 的(控制台大量输出)debug 日志 1.在项目resources路径下新建 logback.xml 2.然后把下面的代码co ...
- 2020年9月程序员工资统计,平均14459元!你给程序员拖后腿了吗?https://jq.qq.com/?_wv=1027&k=JMPndqoM
2020年9月全国招收程序员362409人.2020年9月全国程序员平均工资14459元,工资中位数12500元,其中95%的人的工资介于5250元到35000元. 工资与上个月持平,但是岗位有所增加 ...
- 【二分】CF Round #587 (Div. 3)E2 Numerical Sequence (hard version)
题目大意 有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1~1,1~2....1~n,给你一个\(k\),求第\(k(k<=10^{1 ...
- 落地Azure CosmosDb的一个项目分享
我们遇到了什么? 我们有这么一个业务场景,就是某供应商会去爬取某些数据,爬到后会发到一个FTP上,然后我们定时去获取这些数据 这个数据有大有小,小的30多M数据量百万级,大的数据量能到数百M上千万数据 ...
- k8s- centos7.8搭建
vmware16.0 centos7.8 1. 使用vmware安装 centos环境 cpu4个 内存4G 网络nat模式 2.配置网络 vim /etc/sysconfig/network-sc ...
- canal 配置 多个监听 推送到不同mq
canal整合rabbitmq 见上篇 如果想监听不同库 不同表到不同队列如何操作 1. vim canal.properties canal.destinations = route1,route ...
- spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)
一,什么是swagger? 1, Swagger 是一个规范和完整的文档框架, 用于生成.描述.调用和可视化 RESTful 风格的 Web 服务文档 官方网站: https://swagger.i ...