石家庄做网站费用中国各省旅游网站建设分析
石家庄做网站费用,中国各省旅游网站建设分析,本科软件开发专业,广告制作公司注册目录 1.产生内存溢出原因一 #xff1a;代码中的内存泄漏1.案例1#xff1a;equals()和hashCode()导致的内存泄漏问题#xff1a;**正常情况**#xff1a;**异常情况#xff1a;**解决方案#xff1a; 2.案例2#xff1a;内部类引用外部类问题#xff1a;解决方案… 目录 1.产生内存溢出原因一 代码中的内存泄漏1.案例1equals()和hashCode()导致的内存泄漏问题**正常情况****异常情况**解决方案 2.案例2内部类引用外部类问题解决方案 3.案例3ThreadLocal的使用问题解决方案 4.案例4String的intern方法问题解决方案 5案例5通过静态字段保存对象问题解决方案 案例6资源没有正常关闭问题解决方案 2.产生内存溢出原因二 并发请求问题模拟并发请求 1.产生内存溢出原因一 代码中的内存泄漏 1.案例1equals()和hashCode()导致的内存泄漏
问题
⚫ 在定义新类时没有重写正确的equals()和hashCode()方法。在使用HashMap的场景下如果使用这个类对象作为keyHashMap在判断key是否已经存在时会使用这些方法如果重写方式不正确会导致相同的数据被保存多份。 正常情况
1、以JDK8为例首先调用hash方法计算key的哈希值hash方法中会使用到key的hashcode方法。根据hash方法的结果决定存放的数组中位置。 2、如果没有元素直接放入。如果有元素先判断key是否相等会用到equals方法如果key相等直接替换valuekey不相等走链表或者红黑树查找逻辑其中也会使用equals比对是否相同。
异常情况
1、hashCode方法实现不正确会导致相同id的学生对象计算出来的hash值不同可能会被分到不同的槽中。 2、equals方法实现不正确会导致key在比对时即便学生对象的id是相同的也被认为是不同的key。 3、长时间运行之后HashMap中会保存大量相同id的学生数据。
解决方案
1、在定义新实体时始终重写equals()和hashCode()方法。 2、重写时一定要确定使用了唯一标识去区分不同的对象比如用户的id等。 3、hashmap使用时尽量使用编号id等数据作为key不要将整个实体类对象作为key存放
2.案例2内部类引用外部类
问题
⚫ 1、非静态的内部类默认会持有外部类尽管代码上不再使用外部类所以如果有地方引用了这个非静态内部类会导致外部类也被引用垃圾回收时无法回收这个外部类。 ⚫ 2、匿名内部类对象如果在非静态方法中被创建会持有调用者对象垃圾回收时无法回收调用者
解决方案
1、这个案例中使用内部类的原因是可以直接获取到外部类中的成员变量值简化开发。如果不想持有外部类 对象应该使用静态内部类。 2、使用静态方法可以避免匿名内部类持有调用者对象。
3.案例3ThreadLocal的使用
问题
如果仅仅使用手动创建的线程就算没有调用ThreadLocal的remove方法清理数据也不会产生内存泄漏。因为当线程被回收时ThreadLocal也同样被回收。但是如果使用线程池就不一定了。
解决方案
线程方法执行完一定要调用ThreadLocal中的remove方法清理对象。
4.案例4String的intern方法
问题
JDK6中字符串常量池位于堆内存中的Perm Gen永久代中如果不同字符串的intern方法被大量调用字符串常量池会不停的变大超过永久代内存上限之后就会产生内存溢出问题。
解决方案
1、注意代码中的逻辑尽量不要将随机生成的字符串加入字符串常量池 2、增大永久代空间的大小根据实际的测试/估算结果进行设置-XX:MaxPermSize256M.
5案例5通过静态字段保存对象
问题
如果大量的数据在静态变量中被长期引用数据就不会被释放如果这些数据不再使用就成为了内存泄漏。
解决方案
1、尽量减少将对象长时间的保存在静态变量中如果不再使用必须将对象删除比如在集合中或者将静态变量设置为null。 2、使用单例模式时尽量使用懒加载而不是立即加载。 3、Spring的Bean中不要长期存放大对象如果是缓存用于提升性能尽量设置过期时间定期失效。
案例6资源没有正常关闭
问题
连接和流这些资源会占用内存如果使用完之后没有关闭这部分内存不一定会出现内存泄漏但是会导致close方法不被执行。
解决方案
1、为了防止出现这类的资源对象泄漏问题必须在finally块中关闭不再使用的资源。 2、从 Java 7 开始使用try-with-resources语法可以用于自动关闭资源。
2.产生内存溢出原因二 并发请求问题
⚫ 并发请求问题指的是用户通过发送请求向Java应用获取数据正常情况下Java应用将数据返回之后这部分数据就可以在内存中被释放掉。 ⚫ 并发请求问题指的是用户通过发送请求向Java应用获取数据正常情况下Java应用将数据返回之后这部分数据就可以在内存中被释放掉。但是由于用户的并发请求量有可能很大同时处理数据的时间很长导致大量的数据存在于内存中最终超过了内存的上限导致内存溢出。这类问题的处理思路和内存泄漏类似首先要定位到对象产生的根源。
模拟并发请求
⚫ 使用Apache Jmeter软件可以进行并发请求测试。 ⚫ Apache Jmeter是一款开源的测试软件使用Java语言编写最初是为了测试Web程序目前已经发展成支 持数据库、消息队列、邮件协议等不同类型内容的测试工具。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88493.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!