使用参数-XX:+ HeapDumpOnOutOfMemoryError启动JVM.但它并没有在outofmemory上创造堆积.
当本地分配失败时,Java不会创建heapdump吗?
以下是日志:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1184288 bytes for Chunk::new
# An error report file with more information is saved as:
# D:\product\bin\hs_err_pid5876.log
java.lang.OutOfMemoryError
Run Code Online (Sandbox Code Playgroud)
- 编辑 -
最大堆大小设置为4GB,系统RAM大小为16GB,当内存不足时,它使用> 11GB(由Windows任务管理器显示).
从与@ alain.janinm的讨论....我想我可以得出结论,JVm甚至没有足够的内存来生成heapdump.
那么,创建heapdump是否有可能导致JVM使用那么多系统内存
java java-native-interface out-of-memory native-code heap-dump
最近4天,我一直在尝试使用ndk-gdb在Android应用程序中调试本机C ++代码。但我一直收到这个错误。无法插入断点
我已经在wordpress网站中的mhandroid中使用了针对eclipse-for-android-cc-debugging的本教程进行了学习(请注意,我不能提供两个以上的链接。)
在eclipse中设置断点后,我已将eclipse作为应用程序调试启动。它在Java代码中达到了断点。然后我在Cygwin中运行了ndk-gdb-eclipse(根据教程)。在ndk-gdb中一切运行正常。请参见下图, ndk-gdb在cygwin中运行
然后我在eclipse中以C / C ++应用程序形式启动调试,出现错误“无法插入断点”
我在这里检查了所有帖子,但没有针对此错误的解决方案。
任何人都可以在这个问题上阐明一下吗?提前致谢。
我知道其他人写了类似的问题,但我认为我的情况不同,因为我找不到任何解决方案.
我有一个对象赋值,这个非常简单:
_buffer3 = buffer; //they are just simple reference types
Run Code Online (Sandbox Code Playgroud)
生成的汇编代码如下
mov edx,dword ptr [ebp-3Ch]
mov eax,dword ptr [ebp-40h]
lea edx,[edx+4]
call 69C322F0
Run Code Online (Sandbox Code Playgroud)
现在,只是为了理解发生了什么,我想进入呼叫(为什么要在分配中使用呼叫?).但是,该地址的代码不存在,我无法介入.如果我在地址代码字段中键入地址,那就是显示的内容:
69C322F0 ???
Run Code Online (Sandbox Code Playgroud)
试图解决这个问题的任何帮助?:)
编辑..显然,当在类的方法内分配引用时,会添加神秘的调用.
如果我有这个课程:
private class Test
{
int _X;
int _Y;
Test _t;
public void SetValues(int x, int y, Test t)
{
_X = x;
_Y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
为方法SetValues生成的程序集是:
_X = x;
00000028 mov eax,dword ptr [ebp-3Ch]
0000002b mov edx,dword ptr [ebp-40h]
0000002e mov dword ptr [eax+8],edx
_Y = y;
00000031 …Run Code Online (Sandbox Code Playgroud) 如果您正在运行的代码调用Java中的本机库,那么当内存分配应在对象的生命周期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。
我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装已编译的OpenCL内核以及所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法clReleaseMemObject,您可以调用该方法来递减指示何时应删除对象的引用计数器(请注意,这与直接释放内存有些不同,但在这种情况下,我基本上不这么认为。
我假设如果程序终止时该对象仍然存在,则操作系统将清除所有内容,但是我不确定线程中创建的对象。所以:
如果要在垃圾回收对象时释放本机内存,是否有合适的位置调用释放该内存的方法?
如果对象是将在线程持续时间内持续的对象,那么是否存在进行此调用的适当位置,或者甚至有必要这样做吗?
我与之合作的团队最近面临着使我们的软件与第三方虚拟化软件兼容的挑战.该软件使用内核驱动程序来执行Windows本机注册表API(ZwCreateKey等)的挂钩.它通过挂钩Ntdll中的调用来工作.我们的软件也相当低级,在某些情况下需要访问真实的注册表而不会被钩住.
我们正在探索使用我们自己的内核驱动程序来ZwCreateKey代表我们调用它们的可能性,以避免它们的挂钩.这实质上意味着创建一个NT Legacy驱动程序和一个用户模式库,它提供我们自己的本机注册表功能.库和驱动程序非常简单,我们只需使用IOCTL将所有参数传递ZwCreateKey给我们的驱动程序,然后调用内核版本的调用并返回结果.
该方法运行良好,我们现在似乎在虚拟化时具有读/写真实注册表的系统.唯一的问题是我们的新系统似乎在注册表对象上传播Windows安全性.
ZwCreateKey 采用这样的访问掩码:
NTSTATUS ZwCreateKey(
__out PHANDLE KeyHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__reserved ULONG TitleIndex,
__in_opt PUNICODE_STRING Class,
__in ULONG CreateOptions,
__out_opt PULONG Disposition
);
Run Code Online (Sandbox Code Playgroud)
我的理解是,虽然我们现在在内核模式下运行,但我们仍然拥有用户令牌的上下文.这应该意味着内核版本ZwCreateKey将失败,就像访问掩码测试失败时的用户一样.实际发生的是,即使使用有限的令牌,当我们的驱动程序被调用时,它也能够在受限用户调用时在受限制的部分HKLM中创建密钥.是什么赋予了?我们应该自己进行ACL检查吗?我们是否需要做一些事情来限制我们在内核模式下的权限?任何帮助非常感谢.
我试图在核心Android框架文件中打印日志消息.例如,我尝试在MediaRecorderClient.cpp下面记录消息frameworks\base\media\libmediaplayerservice\.我试过LOGV,LOGE,LOGD,printf,和__android_log_print,没有任何成功.
我应该使用哪个命令来打印日志消息?
java-native-interface logging android native-code mediarecorder
我知道所有程序集都可以通过某种方式进行反编译,但C#和VB应用程序最容易使用(.Net Reflector)等工具反编译成源代码.
所以我的问题是,如果我使用.Net程序集和函数使用C++对应用程序进行编程,是否可以轻松地对其进行反编译,就像使用.Net反射器和此类工具的C#或VB应用程序一样?好的,如果我在没有使用.Net框架的任何功能的情况下对其进行编程,并且只使用了调用.Net程序集的UI,那么它也很容易被破坏吗?
我的问题类似于这个问题: 这个C++项目是否可以用像.NET Reflector这样的工具进行反编译? 但没有人正确回答他,所以有人能帮助我吗?
我想使用.Net和C++将我的应用程序编译成Native和Managed代码!
从 .apk 文件中获取 Java 源文件似乎很容易。但是是否可以通过工具或棘手的方法从 .apk 文件中获取Android.mk或本机源文件?
我正在研究 Android 应用程序本机代码安全性,因此这些文件对我来说非常重要。谢谢。
该文件包含本机汇编代码,我想在当前进程中运行它。\n但我不想创建真正的文件(.com 或 .exe),所以我尝试:
\n\n...\nusing namespace std;\ntypedef void bitcode();\nvoid testcode(){\n cout<<"test";\n};\nint main()\n{\n bitcode *c=&testcode; // bitcode *c stands for the file containing the assembly code.\n bitcode *d=reinterpret_cast<bitcode*> (malloc(20));\n memcpy(d, c, 20);\n d(); // it doesn\'t work\n return 0;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我调用 d(); 时它不起作用。我想知道使用 C/C++ 执行此操作的正确方法是什么。
\n\n(我使用的是Windows,如果你能告诉我如何在Linux上制作它,我\xe2\x80\x99d将非常感激)
\n\n多谢!
\n\nPS:我不是在问“在另一个中运行可执行文件而不创建新进程”。
\n我已经为 android 的不同架构交叉编译了本机代码,并在 android studio 中使用了相应的 jni 包装类。现在我想让它作为一个库使用。我有两个问题:
1)我可以 jar .so 文件和 jni 文件来制作库吗?(不是 .aar 因为我的库只包含纯 java 和本机代码,没有 android 相关的东西,如 .xml、res 等)如果是这样怎么办应该是它的结构?
2) 如果我不能创建 .jar 文件,那么我剩下的就是创建 .aar 文件。这将包括使用android studio。我可以在没有 android studio 的情况下做吗?
编辑 1: 如果我 jar 文件,那么我不想提取 .so 然后使用它。如果我 jar 文件,然后将它(.jar)作为依赖项添加到我的项目中,那么它应该自动将 .so 放入我的 apk 中的 libs/jni 文件夹中,以便 jni 可以找到它。问题是我该怎么做?(如果可能)
java-native-interface android native-code android-ndk android-library