java.lang.OutOfMemoryError: Could not allocate JNI Env

2023-05-16

最近有一些OOM的错误上报

java.lang.OutOfMemoryError: Could not allocate JNI Env

极少量的

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory

一个典型的用户状态是这样的

用户使用时长 1小时56分11秒 前后台状态 后台

设备机型 OPPO R9S 系统版本 Android 6.0.1,level 23

可用内存大小 1.97 GB ( 56.21% ) 可用存储空间 32.91 GB ( 61.23% )

整理异常信息发现各版本机型均有发生,于是去asop查看了错误信息,以及搜索了一下类似堆栈

一个地方是堆操作时

系统源码文件:/art/runtime/gc/http://heap.cc

函数:

void Heap::ThrowOutOfMemoryError(Thread* self, size_t byte_count, AllocatorType allocator_type)

抛出时的错误信息:

oss << "Failed to allocate a " << byte_count << " byte allocation with " << total_bytes_free << " free bytes and " << PrettySize(GetFreeMemoryUntilOOME()) << " until OOM";

另一个个地方是创建线程时

系统源码文件:/art/runtime/http://thread.cc

函数:

void Thread::CreateNativeThread(JNIEnv* env, jobject java_peer, size_t stack_size, bool is_daemon)

抛出时的错误信息:

"Could not allocate JNI Env"

或者

StringPrintf("pthread_create (%s stack) failed: %s", PrettySize(stack_size).c_str(), strerror(pthread_create_result)));

线程限制检查有很多考量因素,不同系统设置不太一样,具体可以见参考链接内容

解决方式

问题原因就是创建了过多的线程,这个过程一般是因为线程创建时逻辑问题,或者线程执行过程中阻塞了造成不能及时释放导致的

我们要先定位到问题线程,编程过程中强制给所有线程命名,包括线程池,OkHttp的Dispatcher等常见场景

如果是第三方一般支持线程信息分析,自己也可以在Thread.UncaughtExceptionHandler获取到对应错误时,收集线程现场

排查过程中也可以使用ps命令来对一些场景进行校验 ps -elfT 来查看线程使用情况,使用=组合 wc -l可以计算数量。

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

java.lang.OutOfMemoryError: Could not allocate JNI Env 的相关文章

  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • sh: 1: glxinfo: not found

    创建模拟器 xff0c 启动模拟器报报错如下 xff1a sh 1 glxinfo not found 处理3 xff1a sudo apt get install mesa utils
  • libGL error: unable to load driver: vmwgfx_dri.

    通过which emulator找到emulator命令执行路径 apt get install lib64stdc 43 43 6 确认你是否在你的系统中安装了lib64stdc 43 43 6 cd ANDROID HOME andro
  • 如何给Ubuntu正确地设置永久环境变量并立即生效

    1 什么是环境变量 环境变量 xff08 environment variables xff09 一般是指在操作系统中用来指定操作系统运行环境的一些参数 xff0c 这些参数会对系统行为产生影响 比如常用的PATH环境变量 xff0c 当要
  • NSURLCache使用的坑

    NSURLCache使用有许多限制 xff0c 苹果限制的 1 只能用在get请求里面 xff0c post可以洗洗睡了 2 缓存机制选择 NSURLRequestReturnCacheDataElseLoad 有缓存从缓存取数据 xff0
  • Volley源码解析

    概述 本文基于Volley 1 1 1版本的源码 Volley是Google官方出的一套小而巧的异步请求库 xff0c 该框架封装的扩展性很强 xff0c 支持HttpClient HttpUrlConnection xff0c 甚至支持O
  • Android Volley源码分析(1)

    1 Volley newRequestQueue 我们从Volley中RequestQueue的初始化入手 xff0c 开始进行分析 应用利用Volley java的静态方法 xff0c 获取RequestQueue xff0c 开启使用V
  • Android Volley源码分析(2)

    1 RequestQueue的add接口 我们从RequestQueue的add接口入手 xff1a public lt T gt Request lt T gt add Request lt T gt request Tag the re
  • 删除git remote

    目前项目中有两个remote git remote v origin https github com test test git fetch origin https github com test test git push test
  • 当 git pull 碰到拒绝合并无关历史

    问题描述 很久之前在 github 上建了个仓库 xff0c 里面只有一个 README md 文件 突然有天 xff0c 我想把本地的一个项目传上去 xff0c 然后就碰到了这样一个问题 xff01 当我 添加远程仓库 后准备提交代码时
  • rxjava2源码解析(一)基本流程分析

    从基本使用入手 首先随便写一个rxjava2的基本用法 xff0c 我们根据这个简单的示例来看看rxjava2整个流程是什么样的 Observable create new ObservableOnSubscribe lt String g
  • rxjava2源码解析(二)线程切换分析

    使用方法 还是先从最基本的使用开始看 xff1a Observable create new ObservableOnSubscribe lt String gt 64 Override public void subscribe Obse
  • rxjava2源码解析(三)observeOn线程池原理分析

    observeOn 还是先说observeOn 直接看源码 xff1a public ObservableObserveOn ObservableSource lt T gt source Scheduler scheduler boole
  • RxJava 2.x 源码分析 之 FlatMap

    FlatMap 官方定义 xff1a 把被观察者发射出去的事件转化成新的子被观察者 xff0c 然后把这些发射量展开平铺后统一放到一个被观察者中 官方文档 简单来讲就是把被观察者每次发射的事件转化成一个子被观察者 xff0c 然后通过合并
  • Transformer 在RxJava中的使用

    Transformer 用途 Transformer xff0c 顾名思义是转换器的意思 早在 RxJava1 x 版本就有了Observable Transformer Single Transformer和Completable Tra
  • 彻底理解kubernetes CNI

    kubernetes各版本离线安装包 CNI接口很简单 xff0c 特别一些新手一定要克服恐惧心里 xff0c 和我一探究竟 xff0c 本文结合原理与实践 xff0c 认真读下来一定会对原理理解非常透彻 环境介绍 我们安装kubernet
  • 将本地项目上传到远程Git服务器

    1 先进入项目文件夹 通过命令 git init 把这个目录变成git可以管理的仓库 git init 2 把文件添加到版本库中 xff0c 使用命令git add 添加到暂存区里面去 xff0c 小数点 34 34 意为添加文件夹下的所有
  • 解决Manifest merger failed : Attribute application@appComponentFactory

    在将butterknife升级到10 0 0的时候遇到问题 xff0c 编译无法通过 Manifest merger failed Attribute application 64 appComponentFactory value 61
  • bindService不能触发onServiceConnected方法的原因

    在android项目中用到AIDL xff0c bindService service connection BIND AUTO CREATE 之后一直不调用 connection中的onServiceConnected方法 可能原因1 1
  • Android应用被浅杀和深杀

    onTaskRemoved 方法在当用户移除应用的一个Task栈时被调用 也就是当用户在最近任务界面把该应用的一个task划掉时 xff0c 或者在最近任务界面进行清理时 这两种情况下onTaskRemoved 都会被调用 xff0c 但在
  • java.lang.OutOfMemoryError: Could not allocate JNI Env

    最近有一些OOM的错误上报 java lang OutOfMemoryError Could not allocate JNI Env 极少量的 java lang OutOfMemoryError pthread create 1040K