热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内存泄漏、内存溢出和堆外内存,JVM优化参数配置

内存泄漏内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不

内存泄漏

内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费。内存泄漏最终会导致OOM。

造成内存泄漏典型场景:

1.单例模式的不正确使用单例对象在初始化后将在JVM的整个生命周期中以静态变量的方式存在。如果单例对象持有对外部对象的引用,那么这个对象将不能被JVM正常回收

2.数据库、网络、IO连接没有被关闭释放这类连接,一般会提供close方法进行显式关闭。但如果没有进行close,是不会自动被gc回收的。

3.不合适的对象引用

比如,生命周期长的对象持有生命周期短的对象的引用就很容易造成内存泄漏,尽管生命周期短的对象已经不再需要,但是因为生命周期长的对象持有对它的引用而导致不能被回收。

内存溢出

内存溢出即out of memory简称OOM。当程序申请内存时,没有足够的内存空间供其使用,往往会出现OOM。比如申请了一个Integer,但给它存了Long类型才能存下的数,那就会导致内存溢出。

堆外内存

关于堆内内存以及相应的内存回收策略,在之前的文章《JVM内存管理和垃圾回收》、《JVM垃圾回收器、内存分配与回收策略》中已有介绍。对于堆外内存是指分配的对象直接受操作系统管理的JVM内存堆以外的空间。同时因为这部分区域直接受操作系统的管理,别的进程可以直接通过操作系统对其进行访问,减少了从JVM中复制数据的过程。

堆外内存适用生命周期较长的对象,具有以下特点:

  1. 可以很方便的自主开辟很大的内存空间,对于大内存有良好的伸缩性
  2. 减少垃圾回收带来的系统停顿时间
  3. 在进程间可以共享对象,减少JVM间的复制过程
  4. 适合那些分配次数少,读写操作频繁的场景

但也存在如下缺点:

  1. 容易出现内存泄漏,并且很难排查
  2. 堆外内存的数据结构不直观,当存储结构复杂的对象时,会浪费大量的时间对其进行串行化

常用JVM配置参数

-Xms:JVM初始最小堆内存

-Xmx:JVM允许最大堆内存

-XX:PermSize:JVM初始非堆内存

-XX:MaxPermSize:JVM允许最大的非堆内存

-XX:+UseConcMarkSweepGC:年老代激活CMS收集器,可以尽量减少fullGC

-XX:+UseParNewGC:设置年轻代为多线程并行收集

-XX:+UseCMSCompactAtFullCollection:在full gc时,对老年代的压缩(CMS的时候,会导致内存碎片,使内存空间不连续,可能会影响性能,但是可以消除碎片)

-XX:CMSInitiatingOccupancyFraction:当老年代被占用空间达到一定比例时触发CMS垃圾收集

-Xverify:none:类加载的时候关闭字节码验证

-XX:+DisableExplicitGC:告诉JVM关掉System.gc

-XX:+CMSParallelRemarkEnabled:再标记算法,降低标记停顿时间

-XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息,主要用于生产环境或者压力测试时候看的信息

-XX:+PrintGCTimeStamps:输出GC的时间戳

-XX:PretenureSizeThreshold:使大对象直接进入老年代


推荐阅读
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 多线程补充(一)JVM内存结构 VS Java内存模型 VS Java对象模型
    一:Java内存结构参考:https:www.zhihu.comquestion64586462answer576543433内存结构࿱ ... [详细]
author-avatar
城市学院艺术英语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有