《深入理解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时候,因为有中断点的
要求,这些优化是不可以的。
《深入理解Java虚拟机》笔记7的更多相关文章
- Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一
Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...
- 深入理解java虚拟机笔记Chapter12
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...
- 深入理解Java虚拟机笔记
1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...
- 深入理解java虚拟机笔记Chapter7
虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 J ...
- 深入理解java虚拟机笔记之一
Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...
- 深入理解Java虚拟机笔记——虚拟机类加载机制
目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...
- 【转载】深入理解Java虚拟机笔记---运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...
- 深入理解java虚拟机笔记Chapter8
运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...
- 深入理解java虚拟机笔记Chapter2
java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...
- 类文件结构——深入理解Java虚拟机 笔记三
在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...
随机推荐
- PHP PDO类 单例
<?php /*//pdo连接信息 $pdo=array("mysql:host=localhost;dbname=demo;charset=utf8","root ...
- 使用0填充string(构造类似‘00001’的字符串)
今天在对视频进行爬取的时候,发现url最后是000001,然后是000002,依次增加,而且每一个url请求只能得到一个分段了的视频,这种情况下构造url就成了一个问题. python有一个函数可以处 ...
- 洛谷——P2035 iCow
P2035 iCow 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N < ...
- 【剑指offer】顺时针打印数组
顺时针打印数组 题意 例如我们有一个二维数组,如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 现在要按照顺时针打印出来,结果应该为: 1 2 3 4 8 12 16 ...
- 求高精度幂(poj1001)
Description Problems involving the computation of exact values of very large magnitude and precision ...
- 如何上传word
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha word图片上传控件 word 图片 上传
- Codeforces 980 E. The Number Games
\(>Codeforces \space 980 E. The Number Games<\) 题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) ...
- 【DFS】【打表】Lattice Animals
[ZOJ2669]Lattice Animals Time Limit: 5 Seconds Memory Limit: 32768 KB Lattice animal is a set o ...
- 操作系统介绍、python基础
操作系统 什么是操作系统? 操作系统位于计算机硬件与应用软件之间,是一个协调.管理.控制计算机硬件资源与软件资源的控制程序. 2.为何要操作系统 ① .控制硬件 ② .把对硬件的复杂的操作封装成 ...
- 十二. 网络与数据库编程1.IP地址和InetAddress类
Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TC ...