另一个SO成员已经提出了这个问题,但令人失望地被删除了.评论说测量是有缺陷的,没有意义.
但是我能够用JMH下的一个小基准重现原始问题:
package bench;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.*;
import org.openjdk.jmh.runner.options.*;
import java.util.concurrent.*;
@State(Scope.Benchmark)
public class LoopInc {
private int getValue() {
return ThreadLocalRandom.current().nextInt(2);
}
@Benchmark
public int directInc() {
int result = 0;
for (int i = 0; i < 1000; i++) {
switch (getValue()) {
case 0:
break;
case 1:
result++;
break;
}
}
return result;
}
@Benchmark
public int indirectInc() {
int result = 0;
for (int i = 0; i < 1000; i++) {
boolean …Run Code Online (Sandbox Code Playgroud) 一段C/C++代码可以为JNI方法提供一个函数指针数组.但是有没有办法直接从Java代码内部(不使用JNI或类似代码)调用数组指针指向的函数?JNI以某种方式做了类似的事情,所以必须有办法.JNI是如何做到的?是通过sun.misc.Unsafe吗?即使不是,我们是否可以使用一些不安全的解决方法来获取执行此操作的JVM代码?
我当然不打算在商业上使用它.我甚至不是专业人士,我只是非常喜欢编码而且我最近一直在研究CUDA所以我想也许我可以尝试将所有东西混合在一起,但JNI调用的开销会破坏GPU加速代码的目的.
我正在使用以下C++代码初始化Java VM.JNI_CreateJavaVM抛出一个0xC0000005异常,但如果忽略它就会成功.
'Jni.exe'(Win32):加载'C:\ Tools\Java\Jdk8.77x86\jre\bin\zip.dll'.无法找到或打开PDB文件.
Jni.exe中0x02900282处抛出异常:0xC0000005:访问冲突读取位置0x00000000.
'Jni.exe'(Win32):加载'C:\ Windows\SysWOW64\shell32.dll'.无法找到或打开PDB文件.
我忘了设置或做某事还是这种"正常"行为?
#include <array>
#include "jni.h"
int main( int argc, char const* args[])
{
JavaVM* jvm;
JNIEnv* env;
std::array<JavaVMOption,1> options;
options[0].optionString = "-Djava.class.path=C:/Users/Thomas/Documents/Visual Studio 2015/Projects/Jni/x64/Debug";
options[0].extraInfo = nullptr;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.options = options.data();
vm_args.nOptions = options.size();
vm_args.ignoreUnrecognized = false;
auto rc = JNI_CreateJavaVM( &jvm, reinterpret_cast<void**>(&env), &vm_args );
if( rc == JNI_OK )
{
jvm->DestroyJavaVM();
}
}
Run Code Online (Sandbox Code Playgroud)
发布和调试以及x86和x64版本都会发生这种情况.
我想测量我的应用程序在数据库中花费了多少时间。
我已将 CPU Profiler 添加到 Intellij 的 Settings / Build / Java Profiler 中,但默认情况下它显示具有大多数 CPU 周期的代码,这对我来说毫无用处,因为 JDBC 驱动程序在收到响应时基本上处于休眠状态。
听起来像挂钟分析是可行的方法,但我不知道如何在 Intellij 的 CPU Profiler 配置窗口中启用它。自述文件说-e wall,而 Intellij 的代理选项看起来完全不同:threads,interval=1ms,framebuf=15000000。我如何配置 Intellij 的异步分析器以使用挂钟?
我想弄清楚为什么Elasticsearch节点上的JVM堆使用率始终保持在80%以上.为了做到这一点,我通过运行来进行堆转储
jmap.exe -heap:format=b 5348
Run Code Online (Sandbox Code Playgroud)
(5348是进程ID).然后我可以使用VisualVM分析转储.
问题是jmap在进行转储时暂停JVM,因此节点基本上处于脱机状态大约5分钟.
本文提出了一种更快的方法,它依赖于gdb在Linux 上使用coredump .我已经尝试过WinDbg,它创建了一个核心转储,但我无法在VisualVM中使用它.
Windows有类似的方法吗?如何在几秒钟内完成堆转储,而不是几分钟?
我正在使用Windows机器来获得logback + slf4j的性能结果
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
public class LogPerformanceAnalyser {
private static final Logger LOG =
LoggerFactory.getLogger(LogPerformanceAnalyser.class);
public LogPerformanceAnalyser() {
((ch.qos.logback.classic.Logger) LOG).setLevel(Level.ERROR);
}
public long getTimeWithCheck() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
if (LOG.isDebugEnabled()) {
LOG.debug("This log is {} check", "with");
}
}
return System.currentTimeMillis() - startTime;
}
public long getTimeWithoutCheck() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
LOG.debug("This log …Run Code Online (Sandbox Code Playgroud) 我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 Pod 预留了 4 个 CPU 和 5 GB 的内存。
-Xms4096m -Xmx4096m -Xss512k -XX:+UseG1GC -XX:+UseStringDeduplication -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 -XX:MaxGCPauseMillis=120 -XX:G1ReservePercent=10
每次我重新部署我们的应用程序并引入一些固定的 QPS 负载时,我观察到 OldGen 上发生了 3 个大峰值,然后它设法保持稳定的和谐。我从一开始就期待稳定的和谐,但不确定一开始的行为。任何人都可以遇到这种情况或知道解决方法。
public static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) throws Throwable {
Runnable runnable = () -> {
for (int i = 0; i < 1000000000; i++) {
num.getAndAdd(1);
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
System.out.println("before sleep");
Thread.sleep(1000);
System.out.println("after sleep");
System.out.println(num);
}
Run Code Online (Sandbox Code Playgroud)
我想设置主线程休眠1000ms,但实际上输出会等到两个子线程计算结束才输出,但是当我把时间调整为100ms时,主线程不会等到结束的子线程。