首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从openjdk11访问com.sun.*类

从openjdk11访问com.sun.*类
EN

Stack Overflow用户
提问于 2019-03-05 20:03:55
回答 2查看 1.8K关注 0票数 7

我有一个Spring应用程序,我想使用类com.sun.management.ThreadMXBean和方法getThreadAllocatedBytes来收集应用程序中分配的字节的信息。我在dockerfile中对它进行了对接,并使用了OpenJDK 11,因为Oracle不能进行文档化。我正在使用docker映像jboss/base-jdk:11并将应用程序部署到Wildfly 16中。

不幸的是,OpenJDK不支持com.sun.*包。有任何方法可以解决这个问题并在com.sun.management.ThreadMXBean.getThreadAllocatedBytes中使用OpenJDK吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-05 20:40:38

因此,对于AdoptJdk 11 (它是OpenJdk的构建),这是可行的:

代码语言:javascript
复制
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;

import java.lang.management.ThreadMXBean;

public class Test {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 
        try { 
            Method getBytes = threadMXBean.getClass().getMethod("getThreadAllocatedBytes", long.class); 
            getBytes.setAccessible(true); 

            long threadId = Thread.currentThread().getId();
            long bytes = (long)getBytes.invoke(threadMXBean, threadId);
            System.out.println(bytes);
        } catch (Throwable e) { 
            System.out.println(e);
        }
    }
}

代码语言:javascript
复制
C:\workspaces\devtools\jdks\adoptjdk\jdk-11.0.2+9\bin\javac Test.java
C:\workspaces\devtools\jdks\adoptjdk\jdk-11.0.2+9\bin\java --add-exports jdk.management/com.sun.management.internal=ALL-UNNAMED Test

而且,在那个码头图像中,它也能工作。

代码语言:javascript
复制
FROM jboss/base-jdk:11
COPY . /app/
WORKDIR /app
CMD java --add-exports jdk.management/com.sun.management.internal=ALL-UNNAMED Test

并在码头运行:

代码语言:javascript
复制
docker build -t openjdktest .
docker run -it openjdktest

编辑

哦,似乎还有更简单的选择。只需将ThreadMXBean对象直接转换为com.sun.management.ThreadMXBean即可

代码语言:javascript
复制
import java.lang.management.ManagementFactory;
import com.sun.management.ThreadMXBean;

public class Test {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = (ThreadMXBean)ManagementFactory.getThreadMXBean(); 
        long bytes = threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId());
        System.out.println(bytes);
    }
}

即使不使用--add-exports参数,也可以运行它。

票数 4
EN

Stack Overflow用户

发布于 2019-03-05 20:22:51

所以,我刚刚下载了OpenJDK 11并提取了它的源代码。

我在里面找到了ThreadImpl,它实现了java.lang.management.ThreadMXBean

事实上你可以在下面找到它

ThreadMXBean确实有一个getThreadAllocatedBytes方法

代码语言:javascript
复制
protected long[] getThreadAllocatedBytes(long[] ids) {
    boolean verified = verifyThreadAllocatedMemory(ids);

    long[] sizes = new long[ids.length];
    java.util.Arrays.fill(sizes, -1);

    if (verified) {
        getThreadAllocatedMemory1(ids, sizes);
    }
    return sizes;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55010673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档