V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
L0L
V2EX  ›  Java

Java JVM 的 native 方法如何进行监控

  •  
  •   L0L · 2022-07-25 22:10:15 +08:00 · 1732 次点击
    这是一个创建于 876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 问题,目前遇到了一个比较奇怪的问题:

    1. 内部公司使用了一些奇怪安全软件,登录了账号后,发现 IDEA 打不开了;
    2. 通过 JvisualVM 监控到一个 windows native 的本地方法发生了堵塞,CPU 达到了 100%;
    3. 写了一个简单的案例,去调用这个方法,发现确实会在扫描大量文件时发生堵塞。

    想找到一种方式查看到当前 jvm ( windows 平台)的 C++的方法调用栈的情况呢? 具体是那个位置造成了死循环(目前看 jdk 层 java 代码未产生死循环)。

    方法名是 WindowsNativeDispatcher.CreateFile0 ,通过 JDK 源码,找到了 natvie 方法的 c 文件

    下面是具体代码:

    JNIEXPORT jlong JNICALL
    Java_sun_nio_fs_WindowsNativeDispatcher_CreateFile0(JNIEnv* env, jclass this,
        jlong address, jint dwDesiredAccess, jint dwShareMode, jlong sdAddress,
        jint dwCreationDisposition, jint dwFlagsAndAttributes)
    {
        HANDLE handle;
        LPCWSTR lpFileName = jlong_to_ptr(address);
    
        SECURITY_ATTRIBUTES securityAttributes;
        LPSECURITY_ATTRIBUTES lpSecurityAttributes;
        PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);
    
    
        if (lpSecurityDescriptor == NULL) {
            lpSecurityAttributes = NULL;
        } else {
            securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
            securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;
            securityAttributes.bInheritHandle = FALSE;
            lpSecurityAttributes = &securityAttributes;
        }
    
        handle = CreateFileW(lpFileName,
                            (DWORD)dwDesiredAccess,
                            (DWORD)dwShareMode,
                            lpSecurityAttributes,
                            (DWORD)dwCreationDisposition,
                            (DWORD)dwFlagsAndAttributes,
                            NULL);
        if (handle == INVALID_HANDLE_VALUE) {
            throwWindowsException(env, GetLastError());
        }
        return ptr_to_jlong(handle);
    }
    
    3 条回复    2022-07-25 22:55:32 +08:00
    ysc3839
        1
    ysc3839  
       2022-07-25 22:13:12 +08:00 via Android   ❤️ 1
    用调试器附加就能看了,比如 x64dbg 。
    不过需要有调试符号才能看到函数名。如果是系统 DLL 可以从微软服务器加载调试符号。
    L0L
        2
    L0L  
    OP
       2022-07-25 22:16:05 +08:00
    @ysc3839 感谢朋友,我去学习下这个工具
    codefever
        3
    codefever  
       2022-07-25 22:55:32 +08:00
    jstat ,可以实时监测系统资源占用与 jvm 运行情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3158 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:54 · PVG 20:54 · LAX 04:54 · JFK 07:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.