Java项目,内存泄漏问题排查与总结,拓展容器相关知识Dockerfile

2023-11-05

问题场景:

现象:有一次发现容器里面启动的java项目探活每过一段时间(大概半小时)就失败,导致项目在容器中重复的重启,服务时好时断。

问题描述

在容器中排查问题的时候发现了两个问题:

  1. 进入容器查看启动日志发现,项目启动之初是能够正常运行并且访问的。在经过一段时间后就出现了OOM,导致项目被hang住了,一直在进行Full GC,最终无法访问。
  2. 在这个情况下,本来想通过jstack命令去看看栈的情况,却收到提示Unable to get pid of LinuxThreads manager thread

问题2原因分析:

先分析解决第二个问题,才能更好的探查第一个问题。通过查阅资料发现,无法使用jstack命令的原因是因为,在容器启动的时候java启动命令作为容器的ENTRYPOINT而启动的,使得启动项目的进程为容器的1号进程(init进程),所以无法使用jstack查看程序的栈情况。【容器的拓展知识】

ENV OPTS=" -javaagent:/jacocoagent_skip_slb-0.8.6.jar=includes=*,output=tcpserver,port=8901,address=*,append=false -Xverify:none -javaagent:/skywalking-agent/skywalking-agent.jar -Dspring.profiles.active=test  -Dspring.application.name=passport -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"

COPY ./git-resource/target/*.jar /app.jar

ENTRYPOINT ["sh", "-c", "java $OPTS -jar /app.jar"]

问题2解决方案:

为了解决无法使用jstack的问题,只能曲线救国,不用java启动命令作为容器的启动命令。将项目启动命令放到shell脚本中,再用sh -c启动容器,这样shell脚本pid就会为1。【拓展:容器启动命令ENTRYPOINT和CMD详解】

ENV OPTS=" -javaagent:/jacocoagent_skip_slb-0.8.6.jar=includes=*,output=tcpserver,port=8901,address=*,append=false -Xverify:none -javaagent:/skywalking-agent/skywalking-agent.jar -Dspring.profiles.active=test  -Dspring.application.name=passport -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"

RUN echo 'java $OPTS -jar /app.jar' > ./entrypoint.sh

RUN chmod 777 ./entrypoint.sh

COPY ./git-resource/target/*.jar /app.jar

ENTRYPOINT ["sh", "-c", "./entrypoint.sh"]

问题1原因分析:

解决了问题2后,上容器使用jps + jstack查看栈情况发现有很多:java.lang.Thread.State: BLOCKED的线程,在等待获取锁0x00000000e1455ca0。继续往下看发现,在使用mybatis查询数据库的时候被sentinel限流拦截了。想起近期因为总部不再支持sentinel,导致查询数据库连接数一直被占用,没被释放,时间长了就使得程序oom
在这里插入图片描述

问题1解决方案:

去掉pom文件中对sentinel的引用,最后就能正常运行了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java项目,内存泄漏问题排查与总结,拓展容器相关知识Dockerfile 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐