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程序员在编写程序的时候不再 ...
随机推荐
- LPCTSTR的含义
LPCTSTR: LP代表指针.C代表不可改变.T代表根据是否定义UNICODE宏而分别define为char或wchar_t.STR代表字符串. 例如: LPCTSTR lp="BMP F ...
- Python 自动化测试全攻略:五种自动化测试模型实战详解
随着移动互联网的发展,软件研发模型逐步完善,软件交付质量越来越受到软件公司的重视,软件测试技术特别是自动化测试技术开始在软件系统研发过程中发挥着越来越重要的作用. 与传统的手工测试技术相比,自动化测试 ...
- node-macaddress
下载 node-macaddressnode-macaddress 检索Linux.OS X和Windows中的MAC地址. 关于MAC地址的一个常见误解是,每个主机只有一个MAC地址, 虽然一个主机 ...
- 11 . Nginx核心原理讲解
应用场景优缺点 应用场景 // 1.静态请求 // 2.反向代理 // 3.负载均衡 // 4.资源缓存 // 5.安全防护 // 6.访问限制IP // 7.访问认证 /* 核心主要是以下三个应用: ...
- 2440启动流程 <转载>
韦东山 博客园 首页 订阅 管理 2440启动过程分析 2440启动过程分析 2440启动过程算是一个难点,不太容易理解,而对于2440启动过程的理解,影响了后面裸机代码执行流程的分析,从而看出2 ...
- Sqlite嵌入式数据库讲解
在计算机系统中,保存数据的方式一般有两种:1. 普通文件方式2. 数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由3个部分构成1. 数据库2. 数据 ...
- 在实际开发中Java中enum的用法
在日常项目的开发中,往往会存在一些固定的值,而且"数据集"中的元素是有限的. 例如:st_code// 一些状态机制:01-激活 02-未激活 03 -注册..等等 还有一特性 ...
- Linux 发行版本简介
1991年的10月5日Linus Benedict Torvalds在comp.os.minix 新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like ker ...
- c# 误区系列(二)
前言 继续整理误区系列,可能会对刚入门的新手有些帮助,然后希望有错误的地方可以指出. 正文 关于泛型方法的确定 class Person<T> { public void add(T a) ...
- py中变量名的“秘密”
今天突然脑子发抽,想到py里有没有指针这个概念,于是我马上google.baidu了一波,发现网上大多都在说py.java.c#这类纯面向对象的编程语言用对象的概念能完全替代指针.那么问题来了,没有指 ...