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

Java Web 程序跑得慢,如何查?

  •  
  •   zhaogaz · 2018-07-27 15:19:11 +08:00 · 4449 次点击
    这是一个创建于 2309 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的,我们这个项目,增加了 MATLAB Runtime 相关的东西。

    项目调用 MATLAB 导出的 jar 包的时候,会调用 MATLAB Runtime c 之类的本地化的东西。导致项目巨慢。

    所以想问问有没有 工具 或 办法 能查一下哪个地方调用慢?

    有经验的朋友指点下?


    我目前感觉的是实例化 jar 包中对象 的时候执行的比较慢,感觉把它构造成一个 Spring Bean 能快一点,还没实验。对象构造的源码还没看呢。。。

    11 条回复    2018-07-28 10:24:14 +08:00
    luosuosile
        1
    luosuosile  
       2018-07-27 16:12:37 +08:00   ❤️ 1
    我来给楼主暖贴。是接口慢吗?不能查看调用日志来分析吗?实例化对象很慢,那对象应该很大?或者实例化的时候有大量循环?,如果没这种事情,实例化对象应该不会慢啊。
    Eugene1024
        2
    Eugene1024  
       2018-07-27 16:20:16 +08:00
    日志 打印程序执行的时间戳
    zhaogaz
        3
    zhaogaz  
    OP
       2018-07-27 16:31:13 +08:00
    @luosuosile 是这样的,我要调用 MATLAB 生成的 jar 包 的话,需要在机器上装一 MATLAB Runtime 无论系统是 linux 还是 windows。大小大约是 1 个多 G 吧。

    装完了之后 这个 jar 包才能正常使用。——》也就意味着,相当于 java 调用 c++ 。

    跟你说的接口不太一样。

    java 这边没啥,就是 一句 new,大不大不知道,循环也不知道,都是 matlab 提供的。人家的 jar 我也没办法改。

    日志是个好办法,我仔细看看。有没有用的上的。debug 输出的东西挺多的,一直没仔细看。
    luosuosile
        4
    luosuosile  
       2018-07-27 16:55:10 +08:00
    @zhaogaz 也有可能是需要实例化的对象太多占满了内存?导致虚拟机需要多次 Full GC,java 调用 c++的话,应该是 c++那边算好了,再把结果返回给 java,这个过程 emm,是不是相当于要经过这样的过程呢从外部设备 io-》 java 虚拟机直接内存-》 java 堆。
    如果是的话,
    假如存在大量的这样的过程,相比会耗费比平常要多的时间。
    我也是信口胡诌的,我没做过,希望能给我解下疑惑呢,感谢。
    Mithril
        5
    Mithril  
       2018-07-27 18:36:27 +08:00
    JNI 调用的话,内存占得多很正常。传一个数组过去它会复制出好几份来。
    你可以直接用 C++调用 Matlab,然后把对象用过 protobuf 一类的东西塞回 JVM,顺便还能做个异步。
    不过最好的办法就是不用 Matlab。一般都是用它做了算法以后找人实现出来,实现的时候就会脱离 matlab 了。
    zhaogaz
        6
    zhaogaz  
    OP
       2018-07-27 18:46:00 +08:00
    @Mithril 哎,其实我也是这么想的,调用 matlab 本身就是几个统计函数。java 写的话就是稍微花点时间。

    上司不同意,说这么用做得快(上司是一名百度回答选手)

    估计以后也不会改了。垃圾公司,过一阵子跳槽好了。。。
    zhaogaz
        7
    zhaogaz  
    OP
       2018-07-27 18:48:58 +08:00
    @luosuosile 我已经把这个对象改成 spring 的 单例 bean 了。简单测了下,效果能接受了,结论就是——》主要就慢在对象初始化了。

    你的疑问,我也没办法解答,抱歉。
    Mithril
        8
    Mithril  
       2018-07-27 18:59:14 +08:00
    @zhaogaz 随便找个统计库就好了啊,不过老板不同意就没办法了。一个产品做成什么样主要还是看老板的品味,上司 low 的话刷点经验等着跑路就好了。
    wdlth
        9
    wdlth  
       2018-07-27 21:29:36 +08:00
    不能用 RPC 中转一下么?每次都要启动 Matlab ?
    skyFuture
        10
    skyFuture  
       2018-07-27 23:52:03 +08:00
    @zhaogaz 可以单独部署一个服务嘛?如果这个服务修改比较少的话,可以采用程序启动的时候开始预热的方法
    codingKingKong
        11
    codingKingKong  
       2018-07-28 10:24:14 +08:00
    @zhaogaz 没有用过 MATLAB 啊, 如果是做单例的话, 小心构造里会不会有每次实例化不同的变量存在就好~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 02:25 · PVG 10:25 · LAX 18:25 · JFK 21:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.