2022年内存溢出异常解决方案总结 .pdf
《2022年内存溢出异常解决方案总结 .pdf》由会员分享,可在线阅读,更多相关《2022年内存溢出异常解决方案总结 .pdf(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、内存溢出异常解决方案总结一 调整虚拟机参数二 立即释放无用的对象三 利用序列化和反序列化技术简单的说 java 中的堆和栈java 把内存分两种:一种是栈内存,另一种是堆内存1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;2。堆内存用来存放由new 创建的对象和数组那些情况可以导致java 内存溢出数据量过于庞大死循环静态变量和静态方法过多无法确定是否被引用的对象,java 虚拟机不回收内存(内存泄漏),循环产生过多重复的对象实体线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时
2、线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足pageContext ,request ,session ,application生命周期request是封装 client端(也就是用户通过browser )提交的请求数据和属性的对象。response 是封装 web server端响应数据和属性的对象。我们经常会将pageContext 、request 、session和 appl
3、ication混为一谈, 因为它们都可以通过 setAttribute()和 getAttribute()来设定或读取属性。但它们之间是有别的,它们最大的区别在于使用范围。pageContext 对象的范围只适用于当前页面范围,即超过这个页面就不能够使用了。所以使用 pageContext 对象向其它页面传递参数是不可能的。request对象的范围是指在一JSP网页发出请求到另一个JSP网页之间, 随后这个属性就失效。session的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性就无效。比如断网或者关闭浏览器。application的范围在服务器一开始执行服务,到服务器
4、关闭为止。它的范围最大,生存周期最长。session主要功能:验证用户是否登录。在几个页面上都能取得。request :只有 跳转页面才能取得。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - application:只要设置一次,所有的网页窗口都可以取得数据。application session request-都需要跨多个页面设置过多application 或每一个session保存过多的对象则性能降低能使用 reques
5、t 就不要使用session 能使用 session的就不要使用application application应用:在线人员统计、在线人员名单列表pageContext: 默认情况下一个页面的保存范围实际上四种属性范围都是通过pageContext 属性完成的pageContext.setAttribute(name,mldn,PageContext.REQUEST_SCOPE);更改红字的名字得到。在另外一页用request去接收String name=(String)request.getAttribute(name); 如果要释放application资源要重新启动服务器四种属性范围都是
6、依靠pageContext展开的,但是在开发中,往往使用session和 request范围最多。JMS如果用过 JMS 的话,会发现它类似写JDBC 或 JCA 代码。它有创建或检索JMS 资源的样板代码,每当你需要编写一个新类来发送或接受消息时,都得重复编写那个样本代码。下面列出了传统JMS 实现涉及的步骤:1、创建 JNDI 初始上下文context;2、从 JNDI 上下文获得队列连接工厂;3、从队列连接工厂取得队列Queue;4、创建一个Session对象;5、创建一个发送或接受对象;6、利用第 5 部创建的发送或接受对象发送或接受消息;7、处理完消息后,关闭所有JMS 资源。Hib
7、ernate 缓存机制以及一级缓存和二级缓存的作用Hibernate 的缓存机制概念:java 对象的属性 (通常是一些集合类型的属性)占用的内存空间。如果对象的占用的内存很大就称为重量级的对象。如果对象的内存小就称为轻量级的对象。Session 的缓存被称为hibernate 的第一级缓存。SessionFactory 的外置缓存称为hibernate 的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存存放元数据和预定义SQL, SessionFactory 的内置缓存是只读缓存。Session 缓存的三大作用:1,减少数据库的访问频率
8、,提高访问性能。2,保证缓存中的对象与数据库同步,位于缓存中的对象称为持久化对象。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 3,当持久化对象之间存在关联时,Session 保证不出现对象图的死锁。Session 如何判断持久化对象的状态的改变呢?Session 加载对象后会为对象值类型的属性复制一份快照。当Session 清理缓存时,比较当前对象和它的快照就可以知道那些属性发生了变化。Session 什么时候清理缓存?1
9、,commit() 方法被调用时2,查询时会清理缓存,保证查询结果能反映对象的最新状态。3,显示的调用session 的 flush 方法。session 清理缓存的特例:当对象使用native 生成器时 会立刻清理缓存向数据库中插入记录。hibernate一级缓存和二级缓存的区别Hibernate 提供了两级缓存,第一级是Session 的缓存。由于Session 对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID 。第二级缓存是一个可插拔的的缓存插件,它是
10、由SessionFactory 负责管理。由于SessionFactory 对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate 集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。Hibernate 的二级缓存策略的一般过程如下:1) 条件查询的时候, 总是发出一条select * from table_name where ,. (选择所有字段)这样的
11、SQL 语句查询数据库,一次获得所有的数据对象。2) 把获得的所有数据对象根据ID 放入到第二级缓存中。3) 当 Hibernate 根据 ID 访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID 放入到缓存。4) 删除、更新、增加数据的时候,同时更新缓存。Hibernate 的二级缓存策略,是针对于ID 查询的缓存策略,对于条件查询则毫无作用。为此, Hibernate 提供了针对条件查询的Query 缓存。Hibernate 的 Query 缓存策略的过程如下:1) Hibernate 首先根据这些信息
12、组成一个Query Key ,Query Key 包括条件查询的请求一般信息: SQL, SQL 需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。2) Hibernate 根据这个Query Key 到 Query 缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在, 查询数据库, 获取结果列表, 把整个结果列表根据Query 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - -
13、Key 放入到 Query 缓存中。3) Query Key 中的 SQL 涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key 都要从缓存中清空。1 什么是单点登陆单点登录( Single Sign On) ,简称为SSO ,是目前比较流行的企业业务整合的解决方案之一。 SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。单点登录的机制也一样,如下图所示,当用户第一次访问应用系统1 的时候,因为还没有登录,会被引导到认证系统中进行登录(1) ;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一
14、个认证的凭据ticket (2 ) ;用户再访问别的应用的时候( 3,5)就会将这个ticket 带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性( 4 ,6 ) 。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2 和应用系统3 了。所有应用系统共享一个身份认证系统。统一的认证系统是SSO 的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。所有应用系统能够
15、识别和提取ticket信息要实现 SSO 的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。接口和抽象类的区别区别一, 两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
16、- - - - - - 第 4 页,共 11 页 - - - - - - - - - 区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写, 也就是说, 可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。区别四, 在抽象类中, 新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。如下给出两者的简单对比表格。接口抽象类多继承支持不支持
17、类型限制没有有,只能是引用类型方法实现继承类型中必须给出方法实现继承类中可以不给出扩展性比较麻烦相对比较灵活多层继承比较麻烦,需要借助虚函数比较灵活笼统点说:接口 = 定义了要做的所有事情,但自己啥也不干抽象类= 做了部分工作,剩下的他不干了,等后来人继续完成3.2 内存泄漏示例3.2.1 示例 1 在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身,那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null 。
18、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)程序员无须管理对象空间具体的分配和释
19、放过程,但必须要关注被释放对象的引用记数是否为 0;(3)一个对象可能被其他对象引用的过程的几种:a.直接赋值,如上例中的A.a = E;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - b.通过参数传递,例如public void addObject(Object E) ;c.其它一些情况如系统调用等。3.3 容易引起内存泄漏的几大原因3.3.1 静态集合类像 HashMap、Vector 等静态集合类的使用最容易引起内存泄漏
20、,因为这些静态变量的生命周期与应用程序一致,如示例1,如果该Vector 是静态的,那么它将一直存在,而其中所有的Object 对象也不能被释放,因为它们也将一直被该Vector 引用着。3.3.2 监听器在 java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener() 等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。3.3.3 物理连接一些物理连接,比如数据库连接和网络连接,除非其显式的关闭了连接,否则是不会自动被GC 回收的。 Java 数据库连接一般用DataSour
21、ce.getConnection()来创建,当不再使用时必须用Close()方法来释放,因为这些连接是独立于JVM 的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而 Connection 一旦回收, Resultset 和 Statement 对象就会立即为NULL 。但是如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭 Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从
22、而引起内存泄漏。STRUTS,SPRING,HIBERNATE 优缺点1.strutsstruts 框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC 的 web 应用程序的开发。优点:Struts 跟 Tomcat、Turbine 等诸多 Apache 项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。除此之外, Struts 的优点主要集中体现在两个方面:Taglib 和页面导航。 Taglib 是 Struts 的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP 开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年内存溢出异常解决方案总结 2022 年内 溢出 异常 解决方案 总结
限制150内