我有一个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吗?
发布于 2019-03-05 20:40:38
因此,对于AdoptJdk 11 (它是OpenJdk的构建),这是可行的:
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);
}
}
}用
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而且,在那个码头图像中,它也能工作。
FROM jboss/base-jdk:11
COPY . /app/
WORKDIR /app
CMD java --add-exports jdk.management/com.sun.management.internal=ALL-UNNAMED Test并在码头运行:
docker build -t openjdktest .
docker run -it openjdktest编辑
哦,似乎还有更简单的选择。只需将ThreadMXBean对象直接转换为com.sun.management.ThreadMXBean即可
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参数,也可以运行它。
发布于 2019-03-05 20:22:51
所以,我刚刚下载了OpenJDK 11并提取了它的源代码。
我在里面找到了ThreadImpl,它实现了java.lang.management.ThreadMXBean

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

ThreadMXBean确实有一个getThreadAllocatedBytes方法
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;
}https://stackoverflow.com/questions/55010673
复制相似问题