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,特点是存取速度很快, ...
随机推荐
- 十八、Java基础--------IO流体系以及字符流
在上一章节中详细介绍集合框架的相关知识,在接下来的几篇文章中将讲述Java中另一个及其重要的知识——IO流,本文主要是讲述IO流的一些基本概念以及字符流的相关应用. IO流 介绍IO流之前先介绍一下什 ...
- emacs + quicklisp + slime
- php中rsa加密解密验证
RSA非对称加密,对敏感的数据传输进行数据加密.验证等.测试环境:wamp.aliyun虚拟主机(lamp)一.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以).下载生 ...
- [已解决]Tomcat启动报 java.net.BindException: Address already in use: JVM_Bind
启动多个Tomcat的的时候记得要改3个端口: <Server port="8001" shutdown="SHUTDOWN"> <Conne ...
- 一. HTML认识
1.1认识什么是纯文本文件txt window自带有一个软件,叫做记事本,记事本保存的格式就是TXT,就是英文text的缩写,术语上称呼为"纯文本文件. TXT文件,只能保存文本内容,是无法 ...
- YOU KNOW NOTHING , SNOW
JVM运行时数据区域 方法区: 用 于存储虚拟机加载的类信息,常量,静态变量,JIT编译后的代码,所有线程共享 堆:所有线程共享,用来存储实例对象. 虚拟机栈:线程私有,生命周期与线程相同,每个方法被 ...
- 20160622001 GridView 删除列 用模板实现删除时提示确认框
GridView在使用CommandField删除时弹出提示框,在.net2005提供的GridView中我们可以直接添加一个 CommandField删除列:<asp:CommandField ...
- mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...
总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...
- 【leetcode❤python】 400. Nth Digit
#-*- coding: UTF-8 -*- class Solution(object): def findNthDigit(self, n): ""&quo ...
- 【Unity】常用代码
//父子节点相关的: parent 变量表示Transform的父节点 root 表示它的根节点,如果没有父节点,它会返回自己 //根据名字查找子节点 Transform Find(string na ...