java 内存机制简介
java内存回收机制
不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。java中对象是采用new或者反射的方法创 建的,这些对象的创建都是在堆中分配,所有对象的回收都是由java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状 况,对他们的申请、引用、被引用、赋值等状况进行监控,java会使用有向图的方法进行管理内存,实时监控是否可以到达,如果不可达,则将其回收,这样也 可以消除应用循环的问题。在java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个给对象赋予了空值null,以下再没有调用过。另一个是给 对象赋予了新值,这样重新分配了空间。
java内存泄露和内存溢出
java内存泄露就是没有及时清理内存垃圾,导致系统无法再提供给你内存资源(内存资源耗尽);而java内存溢出就是你要求分配的内存超出了系统所能给你的,系统不能满足需求,于是产生溢出。
java内存泄露和内存溢出的区别
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求, 于是产生溢出。
java内存泄露就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源。
1、java内存泄露其实就是程序的逻辑问题,造成申请的内存无法释放,这样的话无论多少内存,早晚会被占用光。最简单的例子就是死循环。由于程序判断错误经常出现此类问题。
2、java内存泄露是指在堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序当掉。
3、内存溢出是比如你申请了一个Integer,但是你存了一个long类型才能存下的数,那么就会造成内存溢出。
区别:内存溢出是提供的内存不够;内存泄露是无法提供内存资源。
java内存泄露的几个原因
1、静态集合类象Hash、Vector等的使用最容易引起内存泄露,这些静态变量的声明周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将被Vector等应用着。
2、内部类和外部类的使用容易引起内存泄露的问题。内部类的引用时比较容易遗忘的一种,而且一旦没有释放就可能导致一系列的后继类对象没有释放。此 外程序员还要小心外部模块的不经意的引用。例如程序员A负责A模块,调用了B模块的一个方法如:public void registerMsg(Object b);这种调用就要非常小心,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B是否提供相应的操作去除引用。
3、监听器的使用,java往往会用到监听器,在释放对象的时候没有响应删除监听器的时候也可能导致内存泄露。
4、大量临时变量的使用,没有及时将对象设置为null也可能会导致内存的泄露。
5、数据库的连接没有关闭的情况,包括连接池方法链接数据库,如果没有关闭ResultSet等也可能会出现内存泄露的问题。数据库连接,网络连接 和io连接,除非其显式调用了其close()方法将其连接关闭,否则是不会自动被GC回收的。对于ResultSet和Statement对象可以不进 行显示回收,但Connection一定要现实回收,因为Connection在任何时候都无法自动回收,而Connection一旦回 收,ResultSet和Statement对象就会被设置为null,但是如果没有连接池,情况就不一样了,除了要显示地关闭连接,还必须显示关闭 ResultSet Statement对象(关闭其中一个,另一个也会关闭),否则就会造成大量Statement对象无法释放,从而引起内存泄露。这种情况下一般都会在 try里面去连接,在finally里面释放连接。
java 内存机制简介的更多相关文章
- java基础知识(四)java内存机制
Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...
- java内存机制 垃圾回收
gc机制一 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc ...
- java 内存机制
1.Java的内存机制 Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在 ...
- java内存机制和GC垃圾回收机制
Java 内存区域和GC机制 转载来源于:https://www.cnblogs.com/zhguang/p/3257367.html 感谢 目录 Java垃圾回收概况 Java内存区域 Java对象 ...
- Java内存机制,内存地址
问题一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); // ...
- java内存区域简介
运行时数据区域 1.程序计数器:是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. ...
- Java SPI机制简介
SPI 简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...
- Java 内存机制、内存泄露
http://wenku.baidu.com/view/61f31da6284ac850ad02423e.html 自己注:hashset和hashmap不同 JDK1.6 API 中 HashSet ...
- JAVA内存机制
Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...
随机推荐
- ubuntu 中增加鼠标右键菜单,为Windows 的exe 程序快速增加桌面快捷键
#!/bin/bashmyfile=$NAUTILUS_SCRIPT_SELECTED_FILE_PATHSmyfilename=${myfile##*/}myfilename=${myfilenam ...
- Why does pthread_cond_signal not work?【转】
转自:http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote fa ...
- zigbee学习之路(五):定时器1(查询方式)
一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...
- Intellij IDEA debug介绍
先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...
- Visual Studio的Web Performance Test提取规则详解(1)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
- 【C++/Qt】Qt中的parent形参
在 派生类的构造函数初始化列表中 调用 父类的带有参数的构造函数,是为了初始化从父类继承来的成员变量.因为这些变量无法直接初始化,只能采用这种方式初始化. 而在qt中,MainWindow中的某成员变 ...
- [问题2015S07] 复旦高等代数 II(14级)每周一题(第八教学周)
[问题2015S07] 设 \(A\) 为 \(n\) 阶复方阵, 证明: 存在 \(n\) 阶非异复对称阵 \(S\), 使得 \(A'=S^{-1}AS\), 即 \(A\) 可通过非异复对称阵 ...
- Dialog , ProgressDialog , PopWindow 区别
本质区别: Dialog:非阻塞对话框,弹出对话框时时,后台还可以做事情,点击背景时,对话框消失 ProgressDialog:带有圆形进度或者条形进度的对话框,一般结合handler使用.任务完成后 ...
- mysql多表查询例子
[理解方式]先分别找出每个表中查询出来的结果,然后再将两个结果合并. create database test charset utf8 collate utf8_bin;use test;creat ...
- Robots.txt 协议详解及使用说明
一.Robots.txt协议 Robots协议,也称为爬虫协议.机器人协议等,其全称为“网络爬虫排除标准(Robots Exclusion Protocol)”.网站通过Robots协议告诉搜索引擎哪 ...