当前位置: 首页 > news >正文

运城网站建设网站网站wap版影响权重么

运城网站建设网站,网站wap版影响权重么,免费建手机网站,宠物网站建设方案书http://www.lybbs.net/news_read.do?newsPath2007/9/25/1190684628458.html 1 引言 Java的一个重要优点就是通过垃圾收集器GC #xff08;Garbage Collection#xff09;自动管理内存的回收#xff0c;程序员不需要通过调用函数来释放内存。因此#xff0c;很多程序员…  http://www.lybbs.net/news_read.do?newsPath2007/9/25/1190684628458.html  1 引言     Java的一个重要优点就是通过垃圾收集器GC Garbage Collection自动管理内存的回收程序员不需要通过调用函数来释放内存。因此很多程序员认为Java 不存在内存泄漏问题或者认为即使有内存泄漏也不是程序的责任而是GC 或JVM的问题。其实这种想法是不正确的因为Java 也存在内存泄漏但它的表现与C不同。如果正在开发的Java 代码要全天24 小时在服务器上运行则内存漏洞在此处的影响就比在配置实用程序中的影响要大得多即使最小的漏洞也会导致JVM耗尽全部可用内存。另外在很多嵌入式系统中内存的总量非常有限。在相反的情况下即便程序的生存期较短如果存在分配大量临时对象或者若干吞噬大量内存的对象的任何Java 代码而且当不再需要这些对象时也没有取消对它们的引用则仍然可能达到内存极限。2 Java 内存回收机制     Java 的内存管理就是对象的分配和释放问题。分配内存的方式多种多样取决于该种语言的语法结构。但不论是哪一种语言的内存分配方式最后都要返回所分配的内存块的起始地址即返回一个指针到内存块的首地址。在Java 中所有对象都是在堆Heap中分配的对象的创建通常都是采用new或者是反射的方式但对象释放却有直接的手段所以对象的回收都是由Java虚拟机通过垃圾收集器去完成的。这种收支两条线的方法确实简化了程序员的工作但同时也加重了JVM的工作这也是Java 程序运行速度较慢的原因之一。因为GC 为了能够正确释放对象GC 必须监控每一个对象的运行状态包括对象的申请、引用、被引用、赋值等GC 都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象而释放对象的根本原则就是该对象不再被引用。Java 使用有向图的方式进行内存管理可以消除引用循环的问题例如有三个对象相互引用只要它们和根进程不可达那么GC 也是可以回收它们的。在Java 语言中判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个一个是给对象赋予了空值null以下再没有调用过另一个是给对象赋予了新值即重新分配了内存空间。3 Java 中的内存泄漏3.1 Java 中内存泄漏与C的区别    在Java 中内存泄漏就是存在一些被分配的对象这些对象有下面两个特点首先这些对象是可达的即在有向图中存在通路可以与其相连其次这些对象是无用的即程序以后不会再使用这些对象。如果对象满足这两个条件这些对象就可以判定为Java 中的内存泄漏这些对象不会被GC 所回收然而它却占用内存。在C中内存泄漏的范围更大一些。有些对象被分配了内存空间然后却不可达由于C中没有GC这些内存将永远收不回来。在Java 中这些不可达的对象都由GC 负责回收因此程序员不需要考虑这部分的内存泄漏。通过分析可以得知对于C程序员需要自己管理边和顶点而对于Java 程序员只需要管理边就可以了不需要管理顶点的释放。通过这种方式Java 提高了编程的效率。3.2 内存泄漏示例3.2.1 示例1   在这个例子中循环申请Object 对象并将所申请的对象放入一个Vector 中如果仅仅释放引用本身那么Vector 仍然引用该对象所以这个对象对GC 来说是不可回收的。因此如果对象加入到Vector 后还必须从Vector 中删除最简单的方法就是将Vector对象设置为null。Vector v new Vector(10);for (int i 1; i100; i){Object o new Object();v.add(o);o null;}//此时所有的Object 对象都没有被释放因为变量v 引用这些对象。实际上无用而还被引用的对象GC 就无能为力了事实上GC 认为它还有用这一点是导致内存泄漏最重要的原因。(1)如果要释放对象就必须使其的引用记数为0只有那些不再被引用的对象才能被释放这个原理很简单但是很重要是导致内存泄漏的基本原因也是解决内存泄漏方法的宗旨(2)程序员无须管理对象空间具体的分配和释放过程但必须要关注被释放对象的引用记数是否为0(3)一个对象可能被其他对象引用的过程的几种a.直接赋值如上例中的A.a Eb.通过参数传递例如public void addObject(Object E)c.其它一些情况如系统调用等。3.3 容易引起内存泄漏的几大原因3.3.1 静态集合类      像HashMap、Vector 等静态集合类的使用最容易引起内存泄漏因为这些静态变量的生命周期与应用程序一致如示例1如果该Vector 是静态的那么它将一直存在而其中所有的Object对象也不能被释放因为它们也将一直被该Vector 引用着。3.3.2 监听器     在java 编程中我们都需要和监听器打交道通常一个应用当中会用到很多监听器我们会调用一个控件的诸如addXXXListener()等方法来增加监听器但往往在释放对象的时候却没有记住去删除这些监听器从而增加了内存泄漏的机会。3.3.3 物理连接         一些物理连接比如数据库连接和网络连接除非其显式的关闭了连接否则是不会自动被GC 回收的。Java 数据库连接一般用DataSource.getConnection()来创建当不再使用时必须用Close()方法来释放因为这些连接是独立于JVM的。对于Resultset 和Statement 对象可以不进行显式回收但Connection 一定要显式回收因为Connection 在任何时候都无法自动回收而Connection一旦回收Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池情况就不一样了除了要显式地关闭连接还必须显式地关闭Resultset Statement 对象关闭其中一个另外一个也会关闭否则就会造成大量的Statement 对象无法释放从而引起内存泄漏。3.3.4 内部类和外部模块等的引用        内部类的引用是比较容易遗忘的一种而且一旦没释放可能导致一系列的后继类对象没有释放。对于程序员而言自己的程序很清楚如果发现内存泄漏自己对这些对象的引用可以很快定位并解决但是现在的应用软件并非一个人实现模块化的思想在现代软件中非常明显所以程序员要小心外部模块不经意的引用例如程序员A 负责A 模块调用了B 模块的一个方法如public void registerMsg(Object b);这种调用就要非常小心了传入了一个对象很可能模块B就保持了对该对象的引用这时候就需要注意模块B 是否提供相应的操作去除引用。4 预防和检测内存漏洞    在了解了引起内存泄漏的一些原因后应该尽可能地避免和发现内存泄漏。(1)好的编码习惯。最基本的建议就是尽早释放无用对象的引用大多数程序员在使用临时变量的时候都是让引用变量在退出活动域后自动设置为null。在使用这种方式时候必须特别注意一些复杂的对象图例如数组、列、树、图等这些对象之间有相互引用关系较为复杂。对于这类对象GC 回收它们一般效率较低。如果程序允许尽早将不用的引用对象赋为null。另外建议几点在确认一个对象无用后将其所有引用显式的置为null当类从Jpanel 或Jdialog 或其它容器类继承的时候删除该对象之前不妨调用它的removeall()方法在设一个引用变量为null 值之前应注意该引用变量指向的对象是否被监听若有要首先除去监听器然后才可以赋空值当对象是一个Thread 的时候删除该对象之前不妨调用它的interrupt()方法内存检测过程中不仅要关注自己编写的类对象同时也要关注一些基本类型的对象例如int[]、String、char[]等等如果有数据库连接使用try...finally 结构在finally 中关闭Statement 对象和连接。(2)好的测试工具。在开发中不能完全避免内存泄漏关键要在发现有内存泄漏的时候能用好的测试工具迅速定位问题的所在。市场上已有几种专业检查Java 内存泄漏的工具它们的基本工作原理大同小异都是通过监测Java 程序运行时所有对象的申请、释放等动作将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler、JProbe Profiler、JinSight、Rational 公司的Purify 等。 记    映像Reflector是一个程序分析自己的能力。java.lang.reflect包提供了获取关于字段、构造函数、方法和类的修改器的信息的能力。利用这些信息可以建立和Java Beans组件打交道的工具。可以动态创建组件的特征。    堆heap 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同Java自动管理栈和堆程序员不能直接地设置栈或堆。栈的优势是存取速度比堆要快仅次于直接位于CPU中的寄存器。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。另外栈数据可以共享堆的优势是可以动态地分配内存大小生存期也不必事先告诉编译器Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢。    连接池在实际应用开发中特别是在WEB应用系统中如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤而连接并打开数据库是一件既消耗资源又费时的工作如果频繁发生这种数据库操作系统的性能必然会急剧下降甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法在许多应用程序服务器例如Weblogic,WebSphere,JBoss中基本都提供了这项技术无需自己编程但是深入了解这项技术是非常必要的。  数据库连接池技术的思想非常简单将数据库连接作为对象存储在一个Vector对象中一旦数据库连接建立后不同的数据库访问请求就可以共享这些连接这样通过复用这些已经建立的数据库连接可以克服上述缺点极大地节省系统资源和时间。  数据库连接池的主要操作如下  1建立数据库连接池对象服务器启动。  2按照事先指定的参数创建初始数量的数据库连接即空闲连接数。  3对于一个数据库访问请求直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接且连接数没有达到最大即最大活跃连接数创建一个新的数据库连接。  4存取数据库。  5关闭数据库释放所有数据库连接此时的关闭数据库连接并非真正关闭而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接。  6释放数据库连接池对象服务器停止、维护期间释放数据库连接池对象并释放所有连接。 转载于:https://www.cnblogs.com/starrynight/archive/2012/07/08/2581697.html
http://www.pierceye.com/news/799694/

相关文章:

  • 网站建设桂林永川网站建设公司
  • 英文网站设计制作wordpress搜索不到
  • 企业营销网站建设的基本步骤吉林省建设工程质量监督站网站
  • 现在用什么软件做网站北京工程设计公司排名
  • 烟台网站开发技术找人做网站服务器不是自己的怎么办
  • 网站样式下载pc网站建设的优势是什么
  • 网站是怎么建设的网页制作基础教程第2版葛艳玲答案
  • 企业做一个网站的费用网站设计专业需要什么
  • 昆山住房和城乡建设部网站网站开发用的工具
  • 广州优化网站建设网站建设是怎么赚钱
  • 公司建设网站公司系统软件开发培训机构
  • 小程序分销系统开发成熟的网站怎么做seo推广
  • 网站dns修改wordpress极简清新主题
  • 南京网站建设价位招商门户网站建设方案
  • 中学加强校园网站建设个人博客网站开发的原因
  • 网站域名管理中心广州市外贸网站建设企业
  • wordpress建站位置布吉网站建设价格
  • 网站域名正在维护中企业内网网站建设
  • 广西南宁官方网站企业wordpress和ueeshop
  • access数据库做网站自贸区注册公司有什么优势
  • 福州做网站公司企信网企业信用信息系统黑龙江
  • 网站建设先学什么保定徐水网站建设
  • 济南网站建设哪个好电商创业
  • 如何在年报网站上做遗失公告天津做企业网站公司
  • 嘉兴网站关键词排名网页制作与设计课程设计报告
  • 室内装饰网站模板网络营销的策略
  • 如何做网站充值58百度搜索引擎
  • 专门做衣服的网站有哪些广告公司名字怎么取
  • 亚马逊如何做折扣网站的营销在线3d建模网站
  • 深圳市seo网站设计dz做的网站容易收录吗