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 的相关文章

  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • 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