Java 内存泄露以及避免方法

转载自  Java 内存泄露以及避免方法

内存泄露:  
   是指在程序运行过程中会不断的分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证可以保证系统可以再次使用这些内存。如果存在无用的内存没有被收回来,那就是内存泄露。  

说明: 对于数组的操作,堆和栈的操作需要慎重的考虑是否存在内存泄露(出栈时没有清理最后一个元素即没有对最后一个元素置空)  


垃圾回收机制:  
  a. 跟踪并监控每个java对象,当某个对象处于不可达的状态时,就回收该对象所占用的内存。  
  b. 清理内存分配、回收过程中产生的内存碎片。  


避免内存泄露的小技巧  

a. 尽量使用直接量,对于Byte、Short、Integer、Long、Float、Double、Bolean、Character程序不应该使用new 方式创建对象,而采用直接量创建它们。

b. 使用StringBuilder和StringBuffer进行字符串连接  
   Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可变的字符串,后两者表示可变的字符串。  

   如果使用多个String对象进行字符串连接运算,在运行时可能产生大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降。  

c. 尽量少使用静态变量  
类的静态变量的生命周期和类同步的。在类不被卸载的情况下,类对应类对象会常驻内存,知道程序运行结束。  
如下代码就会存在内存泄露问题:  
class  Person  
{  static Object obj = new Object();  
}  

d.避免在经常调用的方法、循环中创建Java对象。  

e. 缓存经常使用的对象  
   如果有些对象需要经常被用到,可以考虑把这些对象用缓存池保存起来,下次用的时候直接从池中拿。典型的就是数据连接池。  
   如果系统中还有一些常用的基础信息,可以考虑用缓存,实现缓存的方式有如下两种:  
   (1) 使用HashMap进行缓存。  
   (2) 直接使用某些开源的缓存项目。  

   说明:缓存设计本身就是一直以牺牲系统空间来换取运行时间的技术。     

f. 考虑使用SoftReference  
   当程序需要创建长度很大的数组时,可以考虑使用SoftReferene来包装数组元素,而不是直接让将数组元素来引用对象。此时SoftReference是个很好的选择:当内存足够时,它的功能等同于普通引用;当内存不足时,它会牺牲自己,释放软引用所引用的对象。  
注意:由于软引用引用对象的不确定性(软引用所获取的对象可能为null),所以程序取出SoftReference所引用的Java之后,应该显式判断该对象是否为null; 当该对象为null时,应该重建该对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomacat乱码解决

解决方法 解决后

体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景

说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已经烂大街了。。。很简单,用“堆”去实…

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

转载自 jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令 1.Jstack 1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 注:这个和thread dump是同样的结果。但是thread dump是用ki…

RabbitMQ消息队列应用

消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理;二是通过消息队列传输系统日志。目前业界使用较多的消息队…

vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!

回答范例:vuex是vue专用的状态管理库。它以全局方式集中管理应用的状态,并且可以保证状态变更的可预测性。vuex主要解决的问题是多组件之间状态共享的问题,利用各种组件通信方式,我们虽然能够做到状态共享。但是往往需要在多个组件…

常用数据库连接串与驱动总结

1、sql server驱动com.microsoft.sqlserver.jdbc.SQLServerDriver//sql验证jdbc:sqlserver://127.0.0.1:1433;databasenamemydb;Usersa;Password1712682、oracle驱动oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:orcl3、mysql驱动com.mysql.jdbc.Driverjdb…

Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了

https://blog.csdn.net/Charonmomo/article/details/98440968 MySQL-mysql 8.0.17安装 2019年08月04日 09:59:12 Charonmomo 阅读数 1654 标签: MySQL 更多 个人分类: MySQL 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版…

公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已

[遇见数学创作小组] 作者: 心如止水(Java程序员。善于把复杂的数学知识,简洁易懂地表达出来)在学三角这部分的时候,有些书习惯列出诱导公式(induction formula),都列出来的话可以写小半张纸。那什么是“诱导公式”呢?“诱导公式”…

.NET Core开发:项目实践

初始化项目 本来想详细讲一讲dotnet core的,但我对于dotnet core的研究还不到一星期,半吊子,脑子又笨,就不写那些理论出来误人子弟了,还是直接来一篇实践给大家做个参考。废话不多说,直接上项目&#xff0c…

如何使用jstack分析线程状态

转载自 如何使用jstack分析线程状态背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那…

JAVA网络编程实战(笔记)

计算机网络简介 网络编程的目的: 无限电台。。。。传播交流信息,数据交换。通信 想要达到这个效果需要什么: 1.如何准确的定位网络上的一台主机 ip地址192.168.16.124: 端口,定位到这个计算机上的某个资源 2.找到…

让 Java 应用运行更快:性能调优工具及实践

转载自 让 Java 应用运行更快:性能调优工具及实践Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层、数据库层、框架层、JVM 层。通过介绍 Java 性能诊断工具和思路,给…

github 公钥 私钥_github快速使用

##第一次使用github推荐方式Git第一步:下载git工具,这里是链接,选择适合自己的版本进行安装。第二步:安装完成后,鼠标右键找到Git bash,双击打开。第三步:设置SSH key众所周知ssh是加密传输。加…

ASP.NET Core 之 Identity 入门(一)

前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OWIN的东西,所以很多初学者在学习来很费劲&…

蓝桥杯JAVA省赛2013-----B------2(马虎算式)

二、马虎的算式 【解析】&#xff1a;暴力穷举即可 枚举每个位上的数字、组合判断、暴力穷举 【答案】&#xff1a;142 方法一&#xff1a;暴力穷举 package com.kuang.Test; public class Test{public static void main(String[] args) {int ans 0;for(int a 1; a < …

简单解决“无法打开内核设备:\\Global\\vmx86”错误

简单解决“无法打开内核设备:\\Global\\vmx86”错误 本文链接&#xff1a;https://blog.csdn.net/tristan_tian/article/details/79434715 我是win10系统&#xff0c;在小娜搜索“服务”后右击选择使用管理员打开。然后在一大串服务中找到vm开头的服务项&#xff0c;全部都启…

按钮右对齐_Python Tkinter Button按钮

简介BUTTON小工具时使用的按钮添加到各种类型的Python应用&#xff0c;Python允许用户配置按钮的按我们的要求&#xff0c;各种选项可以被设置或重置的要求。BUTTON 小工具时使用的按钮添加到各种类型的Python应用。Python允许用户配置按钮的按我们的要求。各种选项可以被设置或…

Java 内存查看与分析

转载自 Java 内存查看与分析1&#xff1a;gc日志输出在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&#xff0c;gc时间信息&#xff…

【长文干货】浅析分布式系统

测试开发者的共同关注&#xff01; 作者&#xff1a;wadehan&#xff0c;腾讯后台开发高级工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 WeTest导读 我们常常会听说&#xff0c;某个互联网应用的服务器端系统多么牛逼&#xff0c;比如QQ、微信、…