java内存管理,GC,内存泄漏
来源:互联网 发布:java常用算法手册豆瓣 编辑:程序博客网 时间:2024/06/03 00:30
StringBuilder > StringBuffer > String
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer
垃圾处理机制
gc不仅负责垃圾回收,还决定内存分配。
java内存管理主要是对内存中的对象进行内存的分配和回收,我们都知道当我们创建一个对象时,对象的引用放在栈(Stack)中,对象放在堆(heap)中,gc只回收堆里面的对象。当gc检测到一个堆中的一个对象不在被引用时,就会对这个对象进行回收。
当我们创建一个对象时,gc就会监视这个对象的地址,大小以及状态。gc有特定的回收算法,通常使用有向图来记录管理堆中的对象,通过这种方式来确定那些对象正在被引用,那些已经不在被引用,当一个对象不在被引用时,gc就有权回收这个对象。当然可以使用System.gc();Runtime.getRuntime().gc();来显示调用gc。但是java规范不保证gc不一定立即回收。
gc可以使我们在开发时候不用考虑内存回收的事情了,可以防止内存泄漏。
垃圾回收的对象:给对象赋予了null,以后再也没有调用过;给对象赋予了新值,即重新分配了内存空间。
垃圾回收的方法
1、跟踪回收
跟踪回收的方式独立于程序,定期运行来检查垃圾,需要较长时间的中断。
2、标记清除
标记清除的方式需要对程序的对象进行两次扫描,第一次从根(Root)开始扫描,被根引用了的对象标记为不是垃圾,不是垃圾的对象引用的对象同样标记为不是垃圾,以此递归。所有不是垃圾的对象的引用都扫描完了之后。就进行第二次扫描,第一次扫描中没有得到标记的对象就是垃圾了,对此进行回收。
3、复制收集
复制收集的方式只需要对对象进行一次扫描。准备一个「新的空间」,从根开始,对对象进行扫,如果存在对这个对象的引用,就把它复制到「新空间中」。一次扫描结束之后,所有存在于「新空间」的对象就是所有的非垃圾对象。
4、引用计数1、对象时可达的,即在有向图中,存在通路与其相连。2、对象时无用的,即程序以后不会再使用这些对象。引用计数是指,针对每一个对象,保存一个对该对象的引用计数,该对象的引用增加,则相应的引用计数增加。如果对象的引用计数为零,则回收该对象。
优点:实现简单,成本小,中断的时间也较小
缺点:如果对象中存在循环引用,就无法被回收;还有一个缺点就是,引用计数不适合在并行中使用,多个线程同时操作引用计数,会引起数值不一样的问题从而导致内存错误。
内存泄漏的问题:保留下来永远不使用的对象就是内存泄漏
(1)、大量临时变量的使用,没有及时将对象设置为null也可能导致内存的泄露
(2)、数据库的连接没有关闭情况,包括连接池方法连接数据库,如果没有关闭ResultSet等也都可能出现内存泄露的问题。
(3)、静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。
引用计数
引用计数是指,针对每一个对象,保存一个对该对象的引用计数,该对象的引用增加,则相应的引用计数增加。如果对象的引用计数为零,则回收该对象。
- java内存管理,GC,内存泄漏
- Java的GC以及内存泄漏
- java内存管理以及GC
- JAVA 内存管理及GC
- 内存泄漏及管理(01)-简述GC机制和检测工具
- 内存泄漏及管理(01)-简述GC机制和检测工具
- Android GC内存泄漏问题
- java内存管理以及GC工作原理
- Java 垃圾回收机制 [ 内存管理 GC]
- Java的GC与内存管理
- JAVA内存管理和GC机制
- JAVA内存管理与GC机制
- Java中的垃圾回收GC与内存泄漏
- Java中的内存泄漏和GC机制分析
- gc原理和java内存泄漏的例子
- 内存管理之GC
- Java 内存管理原理、内存泄漏实例及解决方案研究
- [JAVA]第二篇(内存管理,HashMap内存泄漏解决办法)
- 多线程技术
- HTML
- 安卓RxJava学习第一弹
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- 装饰者模式(decorator)完全解析
- java内存管理,GC,内存泄漏
- HDU 4155 (博弈 记忆化搜索)
- java 使用html2canvas实现屏幕截图
- ffmpeg 在VC2010 中的环境搭建
- Qt + Qcustomplot绘图插件安装和配置
- C++程序设计语言练习 10.2 一个简单的date类
- 交互式Ruby Shell irb
- 文本框只能输入数字
- Maven管理jar