小编apa*_*gin的帖子

为什么间接增量比直接增量快?

另一个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)

java performance jvm

38
推荐指数
1
解决办法
1420
查看次数

是否可以使用sun.misc.Unsafe在没有JNI的情况下调用C函数?

一段C/C++代码可以为JNI方法提供一个函数指针数组.但是有没有办法直接从Java代码内部(不使用JNI或类似代码)调用数组指针指向的函数?JNI以某种方式做了类似的事情,所以必须有办法.JNI是如何做到的?是通过sun.misc.Unsafe吗?即使不是,我们是否可以使用一些不安全的解决方法来获取执行此操作的JVM代码?

我当然不打算在商业上使用它.我甚至不是专业人士,我只是非常喜欢编码而且我最近一直在研究CUDA所以我想也许我可以尝试将所有东西混合在一起,但JNI调用的开销会破坏GPU加速代码的目的.

c java java-native-interface jvm native-code

22
推荐指数
1
解决办法
3923
查看次数

来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005

我正在使用以下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版本都会发生这种情况.

java java-native-interface jvm visual-studio-2015

10
推荐指数
2
解决办法
3375
查看次数

如何为 Intellij Async Profiler 启用挂钟分析?

我想测量我的应用程序在数据库中花费了多少时间。

我已将 CPU Profiler 添加到 Intellij 的 Settings / Build / Java Profiler 中,但默认情况下它显示具有大多数 CPU 周期的代码,这对我来说毫无用处,因为 JDBC 驱动程序在收到响应时基本上处于休眠状态。

听起来像挂钟分析是可行的方法,但我不知道如何在 Intellij 的 CPU Profiler 配置窗口中启用它。自述文件说-e wall,而 Intellij 的代理选项看起来完全不同:threads,interval=1ms,framebuf=15000000。我如何配置 Intellij 的异步分析器以使用挂钟?

profiler intellij-idea async-profiler

6
推荐指数
1
解决办法
1114
查看次数

如何在窗口中进行堆转储,停机时间最短?

我想弄清楚为什么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有类似的方法吗?如何在几秒钟内完成堆转储,而不是几分钟?

jvm jmap heap-dump elasticsearch

3
推荐指数
1
解决办法
2551
查看次数

使用slf4j API进行logback的性能问题

我正在使用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)

java performance logging

3
推荐指数
1
解决办法
818
查看次数

在开始时管理 JVM OldGen 峰值

我们目前使用的 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

JVM图

每次我重新部署我们的应用程序并引入一些固定的 QPS 负载时,我观察到 OldGen 上发生了 3 个大峰值,然后它设法保持稳定的和谐。我从一开始就期待稳定的和谐,但不确定一开始的行为。任何人都可以遇到这种情况或知道解决方法。

java performance garbage-collection jvm

2
推荐指数
1
解决办法
94
查看次数

主线程超过设定的睡眠时间

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时,主线程不会等到结束的子线程。

java multithreading jvm

1
推荐指数
1
解决办法
708
查看次数