• 《深入理解Java虚拟机》笔记7


    组内有人问我,她写的程序总是在短时间内就jvm异常。

    另外,debug时候又可以正常通过,写的逻辑并不复杂,

    只是用poi检索Excel。第一反应还是程序可能写的有问题,

    也许写了一个jvm未预测的错误,导致jvm崩溃。

    但是,看代码不能发现有什么问题,问题就出在String的

    contains方法,改成indexOf也出错。然后通过插入打印语句

    找到引起错误的Excel文件中单元格位置(debug不出错)。

    看看这单元格中内容也无特异之处,无非就是内容多点。

    把这单元格内容改短,这儿可以顺利通过,别的地方又会

    jvm异常。莫非是这Excel中隐含什么特殊字符,但是怎么调整

    格式,总是不能完全解决。

    把出问题那段代码拿出来单独检索出问题那个单元格又能

    顺利通过,这就奇了怪了,看了下Java中源代码,没有发现

    问题,而且字符串检索这种东西,有bug早就发现了。

    突然想到,既然debug不出错,直接运行出错,单独运行也不错,

    工程运行就出错。这两方式的不同点应该是jit优化啊。

    为了获得更好性能,Java虚拟机在执行的时候会把调用次数

    多的方法编译成本地代码。此次执行程序用的是jdk 7 Server  64版本,

    默认触发即时编译的阀值应该是方法被调用10000次。

    于是,在jvm参数处把此阀值改成一个特别大的数,再次

    运行,程序顺利通过,当然,这只是证明此bug是jit优化引起

    的,jit优化我们还是需要的。这个bug  Java官方应该

    已经解决。先看了下本机的jdk版本还是jdk7的最初版,

    于是卸载此版本,装了jdk7u45,再次运行,这回顺利

    通过。

    另记,有好多人问过我,为什么debug程序时会比实际

    运行慢特别多,答案就是实际运行时,jit编译器会做更多

    的事情,比如说指令重排序了,公共子表达式删除,虚拟机

    指令替换成本地指令等。而debug时候,因为有中断点的

    要求,这些优化是不可以的。

  • 相关阅读:
    攻防世界wp--web robots
    kubernetes二: kubernetes 重要组件安装和集群管理
    kibana配置页面跳转
    二进制安装的k8s添加新的node节点
    分布式和微服务的区别
    kubernetes一: 二进制安装k8s集群
    kibana导入导出dashborad
    elk 创建一个只读用户
    x-pack模式下修改es集群密码
    docker基础命令
  • 原文地址:https://www.cnblogs.com/zwm512327/p/3574727.html
Copyright © 2020-2023  润新知