堆外内存溢出_lettuce 堆外内存溢出 - CSDN
精华内容
参与话题
  • 在工作中类似死循环的案例普通测试时测不出来的,一旦项目上线,会爆出很多雷,推荐使用Jmeter压测工具,它可以测出两种类型错误:内存泄露,并发与同步。 mac笔记本安装Jmeter: brew install jmeter //事先安装...

    在工作中类似死循环的案例普通测试时测不出来的,一旦项目上线,会爆出很多雷,推荐使用Jmeter压测工具,它可以测出两种类型错误:内存泄露,并发与同步。
    mac笔记本安装Jmeter:

    brew install jmeter //事先安装homebrew才可使用此命令
    open /usr/local/bin/jmeter  //打开JMeter
    

    压测关注几个指标:
    HPS:点击率
    TPS:一个完整的业务流程,不同于数据库事务
    QPS:Query Per Second 每秒查询率,每秒响应请求数
    吞吐量:单位时间内处理请求的数量
    响应时间

    以下是测试www.baidu.com的接口情况,设置200个线程:处理请求最少6ms,最长371ms,吞吐量达到1520.9/s,性能确实不错。
    在这里插入图片描述
    压测项目接口列表如下:
    在这里插入图片描述
    由此推出:
    单独网关服务,nginx,简单服务,吞吐量都很高,可是通过nginx代理到网关,然后网关路由到服务,吞吐量明显下降,可见调用链路越长,中间件越多,对性能影响越大。
    性能优化从业务一般考虑如下几个方面:
    1、DB(考虑sql加索引,sql优化)
    2、模板渲染速度(thymeleaf线上要打开缓存,开发关闭)
    3、静态资源(nginx动静分离)
    4、visualvm查看GC情况,如果GC次数过多证明分配内存偏小
    5、业务优化(优化掉频繁查库的操作)
    6、加入redis缓存

    在做到第6步的时候,发生堆外内存溢出
    在这里插入图片描述
    查看原因,发现springboot在2.0后默认使用lettuce操作redis客户端,它使用netty通信,lettuce的bug导致堆外内存溢出,底层实现是只要有操作,会统计内存使用量,操作完会decrement减内存,可能是lettuce客户端在减内存的过程出错。
    在这里插入图片描述
    对这个问题调节-Xmx大小不起作用,而且如果netty没指定堆外内存,默认使用-Xmx,所以一旦出现问题,就算调大-Xmx也总会到堆外内存溢出的地步。所以我们不能用io.netty.maxDirectMemory只修改堆外内存大小。
    解决方案:
    1、升级lettuce客户端
    2、排除lettuce依赖,使用jedis

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    

    总结:
    不破不立,任何新事物的引入必然导致新问题的发生,这是规律,引入redis还会存在其他的问题,究竟如何,我们下篇博客再见!

    展开全文
  • 案例介绍:一个学校的小型项目:基于B/S的电子考试系统,为了实现客户端能实时地从

    1、案例介绍

    一个学校的小型项目:基于B/S的电子考试系统,为了实现客户端能实时地从服务器端接收考试数据,系统使用了逆向AJAX技术,选用CometD1.1.1作为服务端推送框架,服务器是Jetty 7.1.4,硬件为一台普通的PC机,Core i5 CPU,4GB内存,运行32位的Windows操作系统,

    2、出现的问题

    测试期间发现服务不定时的抛出内存溢出的异常,服务器不一定每次都出现异常,但是如果假设在考试时出现崩溃一次,那估计整个电子考试系统都会乱套,虽然管理员把堆开到最大,那32位的windows最大也就1.6G,并且还基本没效果,说明不是堆的大小的问题,而且抛出内存溢出异常好像更加频繁了,加入 -XX:+HeapDumpOnOutOfMemoryError (堆转储文件dump),居然没有任何反应,更加确定不是堆的问题,之后挂着jstat(虚拟机统计信息监视工具) 运行服务,发现GC不频繁,Eden区,Survivor区,老年代,永久代都没问题,但是还是不停的抛出内存溢出的异常,最后在内存溢出后从系统日志找到了异常的堆栈,
    其中错误是这样的:

    [.....] handle failed java.lang.OutOfMemoryError:null
    at sun.misc.Unsafe.allocateMemory(Native Method)
    at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:99)
    at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
    at org.eclipse.jetty.io.nio.DirectNIOBuffer.<init>
    

    3、解析上面的错误:

    OutOfMemoryError:null 肯定不是JVM运行时数据结构中的内存溢出,因为他们都有专属的,而不是null,而又属于内存溢出,那可以想一想除了那五种结构,还有哪种可以内存溢出?
    就是本机直接内存,也叫堆外内存,可以自己上网查查,自己总结的不是很好,就不贴上去了
    在这个错误中看到了
    Unsafe.allocateMemory
    nio.DirectByteBuffer
    nio.ByteBuffer.allocateDirect
    io.nio.DirectNIOBuffer
    这些都是堆外内存出现溢出时可能会报的错误,再考虑dump文件没有任何异常,那就更加符合这个观点

    4、分析这个案例中堆外溢出

    大家都知道操作系统对每个进程能管理的内存都是有限制的,对于32位的而言,Linux最大可以提升到接近4G,而Windows也就2G,而堆的实际内存也就1.6G,那留给堆外内存的大小也就0.4G
    这个问题的关键: 垃圾回收进行时,虚拟机虽然会对Direct Memory进行回收,但是Direct Memory却不能像新生代和老年代那样,发现空间不足就通知收集器进行回收,它只能等待老年代满了后Full GC,然后"顺便地"帮他清理掉内存中废弃的对象,否则它只能等内存溢出后异常后,先catch掉,再在catch块里"大喊"一声:“System.gc()”,要是虚拟机还是不听,(譬如打开了 -XX:+DisableExplicitGC 开关),就只能眼睁睁的看着堆中还有很多空闲的内存,而堆外内存不得不抛出内存溢出异常,而本案例中使用的CometD1.1.1框架,正好有大量的NIO操作需要使用到Direct Memory 内存,
    所以这里既有框架CometD1.1.1的缺陷(大量的NIO用到了Direct Memory 内存),也有硬件的缺陷(32位windows系统最大内存为2.0,堆最大时,堆外内存0.4G),

    当然这里也可以自己设置堆外内存的大小,但是堆外内存大了,那堆内存就会减小(因为这个32位的Windos系统一个进程管理的最大内存为2G(包括堆内存和堆外内存))

    自我感觉要不换系统,换成Linux或者换掉CometD1.1.1框架

    5、总结

    做项目肯定是软件适应硬件,而不是硬件适应软件,要考虑到每个框架它如果存储数据数据存储在JVM的哪里,会不会出现像上面那样容易出现内存溢出,根据硬件合理选择框架,

    6、还有一些需要耗费内存的地方

    内存总和总是受到操作系统进程最大内存的限制

    除了永久代需要耗费内存,还有很多需要耗费内存。

    1. Direct Memory:和案例中一样,可以通过 -XX:MaxDirectMemorySize调整大小
    2. 线程堆栈:可以通过**-Xss** 调整大小,内存不足时抛出StackOverflowError或者OutOfMemoryError:unable to create new native thread
    3. Socket缓存区:每个Socket连接都有Receive和Send两个缓存区,连接多的话占用内存也挺多的,内存不足就抛:IOException:Too many open files异常
    4. JNI代码:如果代码中使用JNI调用本地库,那本地库使用的内存也不在堆中
    5. 虚拟机和GC:虚拟机,GC的代码执行也要消耗一定的内存。

    关于JNI可以看百度百科JNI

    展开全文
  • Java堆外内存及导致的溢出错误

    千次阅读 2017-05-11 11:09:04
    除了Java和永生代之外,还有一些区域会占用较多的内存,而这些内存总和可能受到操作系统进程最大的内存限制。比如,一个服务器内存2G,其中1.6G分配给Java,另外的0.4G分配给操作系统和下面的区域,那么0.4G很...

         除了Java堆和永生代之外,还有一些区域会占用较多的内存,而这些内存总和可能受到操作系统进程最大的内存限制。比如,一个服务器内存2G,其中1.6G分配给Java堆,另外的0.4G分配给操作系统和下面的区域,那么0.4G很可能不够用。例如当Direct Memory占用过多的内存时,虚拟机虽然会对Direct Memory进行回收,但是却不像新生代,老年代一样,发现空间不足了就通知收集器进行垃圾回收,它只能等待老年代满了后进行Full GC,然后顺便帮它清理一下内存中的废弃对象。否则,它只有等到抛出内存溢出异常后,先catch掉,再在catch块里大喊一声:System.gc();若是虚拟机没有执行,它就只有看着堆中还有很多空闲内存,而自己却抛出内存溢出异常。例如:NIO操作需要使用到Direct Memory内存。

        1、Direct Memory:其是堆外缓存Big Memory的一个实现,它能够在内存中序列化大批量对象,而不影响JVM垃圾回收的性能。可通过-XX:MaxDirectMemorySize调整大小,内存不足时抛出OutOfMemoryError或者OutOfMemoryError:Direct buffer memory。

        2、线程堆栈:可通过-Xss调整大小,内存不足时抛出StackOverflowError(无法分配新的栈帧)或者OutOfMemoryError:unable to create new native thread(无法建立新的线程)。

        3、Socket缓存区:每个Socket连接都Receive和Send两个缓存区,分别占大约37kb和25kb内存,连接多的话这块内存占用也比较客观,如果无法分配,则可能会抛出IOException:Too many open files异常。

         4、JNI代码:如果代码中使用JNI调用本地库,那本地库使用的内存也不在堆中。

         5、虚拟机和GC:虚拟机和GC的代码执行也需要一定的内存。

    展开全文
  • 堆外内存溢出定位

    千次阅读 2019-01-23 23:30:19
    定位 Java 中的堆外内存溢出,首先需要有一定的 JVM 知识基础;其次,不同的溢出场景,还需要对相应的知识有所了解;最后,再配合合理的分析以及猜测。因此,定位溢出有一定的门槛,定位的过程也是学习的过程。 本次...

    定位 Java 中的堆外内存溢出,首先需要有一定的 JVM 知识基础;其次,不同的溢出场景,还需要对相应的知识有所了解;最后,再配合合理的分析以及猜测。因此,定位溢出有一定的门槛,定位的过程也是学习的过程。

    本次针对线上的堆外内存溢出实例,包含以下几个部分:

    1. 溢出现象;
    2. 定位过程&原理分析。

    本场 Chat 您将学到如下内容:

    1. 堆外内存溢出的定位过程;
    2. HBase Client 读写的 RPC 源码解析;
    3. 涉及的 JVM 相关知识;
    4. 涉及的 IO 模型原理。

    阅读全文: http://gitbook.cn/gitchat/activity/5c3ea1308e82603d397ef34c

    您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

    FtooAtPSkEJwnW-9xkCLqSTRpBKX

    展开全文
  • 一、堆外内存组成 通常JVM的参数我们会配置 -Xms 初始内存 -Xmx 最大内存 -XX:+UseG1GC/CMS 垃圾回收器 -XX:+DisableExplicitGC 禁止显示GC -XX:MaxDirectMemorySize 设置最大堆外内存,默认是-xmx-survivor,...
  • 记一次堆外内存溢出排查过程

    万次阅读 2019-01-29 11:30:59
    服务器发布/重启后,进程占用内存 21%(3g),观察进程占用内存,以一天4%左右的速度增长,一定时间过后,java 进程内存增长到接近 90%,服务器报警。此时 old 区占用 50%,未达到 CMS GC 阈值,因此不会触发 CMS GC,...
  • tsync堆外内存溢出排查经过

    千次阅读 2018-10-30 18:21:52
    一、发生得问题 tsync服务总是莫名得宕机,java进程被莫名其妙的消失了。...当时怀疑有可能是堆内内存溢出,查看监控,系统物理内存: 发现物理内存确实使用了100%。 继续看java堆内存: 发现java堆内内存很正常o...
  • 堆外内存泄露

    千次阅读 2017-08-25 12:29:15
    原文:...
  • 一、 栈溢出(StackOverflowError) 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,...
  • JVM系列之OOM异常

    万次阅读 2020-06-04 22:27:53
    之前我们简单的介绍了下虚拟机内存结构,今天我们讲下虚拟机的内存相关错误异常,主要从几大内存区域分类介绍:Java溢出、虚拟机栈和本地方法栈溢出、方法区和运行时常量池溢出、本机直接内存溢出。 Java溢出...
  • 【4】JVM-实战OutOfMemoryError异常

    万次阅读 2019-12-08 17:58:48
    目录 知识点1:Java堆溢出 ...错误原因:java.lang.OutOfMemoryError: Java heap space 堆内存溢出 解决办法:设置堆内存大小// -Xms1m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryEr...
  • eclipse设置内存参数 堆内存溢出

    千次阅读 2016-03-16 12:39:58
    -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • 何时发生栈内存溢出? 什么时候会发生栈溢出? 帮助记忆: 解释图: 上图是jvm内存模型中最为重要的三部分,方法区中存储的是类模板,中存放的是实例对象,每个线程都会生成一个栈。 何时发生栈内存溢出? ...
  • 项目里面有多个接口,写了多线程调用接口测试,springboot中有简单的计算过程和复杂的计算(调用了tensorflow的依赖),其内存一直增加,超过了-xmx的值 10240,不知有人遇到过同样的问题,或者有解决方法没,...
  • Java内存溢出与栈溢出

    万次阅读 多人点赞 2015-01-23 11:03:10
    一、背景知识 1、JVM体系结构 2、JVM运行时数据区 ...3、JVM内存模型 JVM运行时内存 = 共享内存区 + ...共享内存区 = 持久带 + 持久带 = 方法区 + 其他 = Old Space + Young Space Young Space = Eden +
  • WAS 中JAVA内存溢出的解决方法

    千次阅读 2014-06-06 12:55:33
    内存溢出是使用WAS时会经常遇到的问题。 ...首先查看systemerr.log确定内存溢出的原因,是PermSize太小,还是Native thread无法创建,前者用MaxPermSize调整(IBM JDK没这个参数),后者调小最大
  • jmap、 jhat 分析堆内存溢出

    千次阅读 2017-03-04 18:34:01
    查看该进程下堆内存的使用情况 jmap -heap 1963(进程号) 查看存活对象的内存使用情况 jmap -histo:live 1963 jmap -histo:live 1963 >1.txt 将信息输出到指定文件中可以找到造成内存溢出的具体方法。3.还可以...
  • 定位JVM内存溢出问题思路总结

    万次阅读 2013-11-11 12:03:26
    JVM的内存溢出问题,是个常见而有时候有非常难以定位的问题。定位内存溢出问题常见方法有很多,但是其实很多情况下可供你选择的有效手段非常有限。很多方法在一些实际场景下没有实用价值。这里总结下我的一些定位...
  • hive> select * from t_test where ds=20150323 limit 2; OK Exception in thread "main" java.lang....问题原因: hive堆内存默认为256M   这个问题的解决方法为: 修改/usr/lib/hive/bin/hive-con
  • 在进行代码调试的时候,经常需要模拟内存溢出的情况,这个时候就需要修改程序运行时堆内存的大小,从而在不影响当前主机的情况下,模拟简单的模拟出内存溢出的情况。下面介绍一下,在idea中怎么修改程序运行时堆内存...
1 2 3 4 5 ... 20
收藏数 102,694
精华内容 41,077
关键字:

堆外内存溢出