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

Java debug 断点问题咨询

  •  
  •   codingbody · 2021-03-17 19:09:36 +08:00 · 2431 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有老哥知道为什么吗?有点晕了。

    190346

    190549

    190652

    14 条回复    2021-03-18 13:00:31 +08:00
    ignor
        1
    ignor  
       2021-03-17 19:14:53 +08:00 via Android
    一些明显没有意义的语句被编译器优化掉了
    codingbody
        2
    codingbody  
    OP
       2021-03-17 19:20:59 +08:00
    @ignor #1 我看了编译后字节码,一样的。
    codingbody
        3
    codingbody  
    OP
       2021-03-17 19:24:36 +08:00
    这是图 1 和 图 2 字节码对比:
    ![192031]( https://image.yuhaowin.com/2021/03/17/192031.png)
    ignor
        4
    ignor  
       2021-03-17 20:59:04 +08:00 via Android
    运行时也会优化的,关掉 JIT 优化试试
    ignor
        5
    ignor  
       2021-03-17 20:59:39 +08:00 via Android
    当然,最好是绕开这个问题
    zhzy0077
        6
    zhzy0077  
       2021-03-17 23:12:02 +08:00
    Java 不是 C/Rust 这种编译到机器指令的语言,就算是字节码最后也是 JVM 解释执行的,这里是一个很明显的常量推导,JVM 没理由再把那个 if 留着。最好别纠缠在这种优化的问题上,你的实际场景是什么?
    yannxia
        7
    yannxia  
       2021-03-17 23:19:20 +08:00
    图二的字节码反编译之后如下
    <a href="https://sm.ms/image/PXaW46JO8GZgTfd" target="_blank"><img src="https://i.loli.net/2021/03/17/PXaW46JO8GZgTfd.png" ></a>
    Xuanyian
        8
    Xuanyian  
       2021-03-17 23:39:22 +08:00
    @codingbody continue 那句是 L8,从字节码上来看根本到不了 L8 。一旦 JVM 优化它就会被删掉。所以关键是会不会触发 JVM 的优化。你可以试试看把 value 设成“11”然后把 key 设成 null,这样的话 JVM 还是会触发优化。你应该还是不可以进到断点。
    你也可以把 key 改成 boolean,只要他是 true,就会在 OR 条件下触发优化,value 是什么都无所谓。
    这里边应该是两层优化,一个是生成字节码时对 continue 的优化,另一个是 JVM 对 IF 语句的优化。
    codingbody
        9
    codingbody  
    OP
       2021-03-17 23:41:03 +08:00 via iPhone
    @zhzy0077 实际的场景是,我有一些 k=v 的字符串,需要对其中的 k 或 v 为空的过滤掉,测试的时候发现不是所有满足过滤条件的数据都会进去 continue 断点。
    lxilu
        10
    lxilu  
       2021-03-18 00:20:26 +08:00 via iPhone
    整个 main 都会被 JIT 抹掉吧
    des
        11
    des  
       2021-03-18 00:45:18 +08:00 via iPhone
    问一下,debug 模式 jvm 也会进行优化的吗?
    967182
        12
    967182  
       2021-03-18 09:30:15 +08:00
    JIT 这种没毛线用的语句老子才不给你跑呢!
    zhzy0077
        13
    zhzy0077  
       2021-03-18 10:59:18 +08:00
    @codingbody 这里你真要测最简单就是从文本或者 io 输入这两个字符串 jvm*一般*是不会对预测不到的变量做优化的。
    codingbody
        14
    codingbody  
    OP
       2021-03-18 13:00:31 +08:00
    @zhzy0077 #13 真实业务场景的确是读取的两个值,在 debug 的时候发现有些情况下(如:读取的 key,value 都是空)无法进入 continue 断点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:21 · PVG 17:21 · LAX 01:21 · JFK 04:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.