Java程序运行机制及错误分析

  • 时间:
  • 1571人关注

这篇文章主要主要介绍了Java虚拟机(JVM)的有关内容以及Java程序的运行机制和错误分析,需要的朋友可以了解下。,另外这篇文章主要知识点是关于java、程序运行机制、错误分析、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。

       Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。

1.为什么要使用Java虚拟机

      Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编 译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台 相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字 节码时,把字节码解释成具体平台上的机器指令执行。

Java运行机制

Java程序的运行必须经过编写 、编译 、运行 三个步骤。

编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名为.java的Java源文件。

编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,这不像C语言那样最终生成可执行文件。

运行是指使用Java解释器将字节码文件翻译成机器代码,执行并显示结果

字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。

Java解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被称为Java虚拟机的软件平台之上。

Java虚拟机(JVM)是运行Java程序的软件环境,Java解释器就是Java虚拟机的一部分。在运行Java程序时,首先会启动JVM,然 后由它来负责解释执行Java的字节码,并且Java字节码只能运行于JVM之上。这样利用JVM就可以把Java字节码程序和具体的硬件平台以及操作系 统环境分隔开来,只要在不同的计算机上安装了针对于特定具体平台的JVM,Java程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用 考虑字节码文件是在何种平台上生成的。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM是Java平台 无关的基础,Java的跨平台特性正是通过在JVM中运行Java程序实现的。

Java语言这种“一次编写,到处运行(write once,run anywhere)”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。

需要注意的是,Java程序通过JVM可以达到跨平台特性,但JVM是不跨平台的。也就是说,不同操作系统之上的JVM是不同的,Windows平台之上的JVM不能用在Linux上面,反之亦然。

JAVA程序运行错误分析

一般来说,一个已经投入运营的大型项目出现问题的可能最多如下几种情况:

1.异常的CPU使用

1)查看CPU使用率,与目标进程的使用情况,再查看每个内核的使用情况。可以辅助定位是单个线程问题或线程池问题。

2)有时,程序在正常一段时间后,突然CPU垂直升高,那么可能与程序内的锁有关(如果锁持有的时间很短,不如试试cas+yield来实现自旋锁)

3)死锁,直接导出调用栈,寻找问题解决。

2.异常的内存

1)内存泄漏,没什么好说的,dump出堆栈查找问题

2)频繁的GC也会导致性能不足,在程序经常出现GC的情况下,就要注意了,调高新生代大小如果仍然不能解决则需要定位大量创建临时对象的代码(可以使用对象池技术来避免内存重复申请的情况)

3.某个工作线程的意外终止

4.异常的IO

1)查看打开文件,IO操作占用,磁盘使用率。可以使用命令 df iostat 等

2)查看是否有程序占用监听,网络使用率,可以使用命令 netstat 等

使用工具分析故障

1.jmap

jmap pid 默认查看JAVA进程中内存使用相关信息

jmap -histo pid 查看内存中活跃的实例数量

jmap -dump:format=b,file=(文件名) pid 完整导出java程序内存。完整分析分三个流程,在程序初始化完毕后执行一次 jmap -dump:format=b,file=a.bin 然后在内存占用开始出现上涨的时候执行一次,最后等达到上限后再执行一次,用JHat或者第三方工具来打开dump文件。

3.jstack或者JCONSOLE

默认 可以查看进程调用栈信息,用来分析IO超时,死锁,或者其他情况。程序出现异常必须要分析的信息,可以辅助问题的定位和排除。

jstat -gc pid gaptime 查看GC相关信息

jstat -compiler pid 查看实时编译信息

4.kill -3

同上,适用于没有安装develop工具的服务器,可以输出调用栈信息和部分GC信息

5.iftop 查看网口
查看网络出入流量与目标服务器之间的流量,可以辅助排查是否由攻击引起的

 pstack 虚拟机堆栈

需要安装gdb,一般用于检查c/c++程序,在某些虚拟机级错误的时候。

总结

Java程序的执行过程,必须经过先编译,后解释两个步骤。有关Java程序运行机制及错误分析的介绍就到这里,希望对大家有所帮助。感兴趣的朋友可以参阅本站其他专题,在此希望大家对本站多多支持。


上一篇:spring boot+mybatis 多数据源切换实例讲解

下一篇:JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

相关内容

  • 如何用Java实现将容器 Map中的内容保存到数组

    这篇文章主要介绍了Java实现将容器 Map中的内容保存到数组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    05-03Java Map内容保存数组

    阅读更多
  • 如何让java程序运行

    04-29java程序运行

    阅读更多
  • java是如何输出的

    04-29java输出的方式

    阅读更多
  • java如何调用接口

    其实对于java调用接口进行获取对方服务器的数据在开发中特别常见,然而一些常用的基础的知识总是掌握不牢,让人容易忘记,写下来闲的时候看看,比回想总会好一些。 总体而言,一些东西知识点一直复制粘贴容易依赖,重要的是会忘记为什么这么写,只有理解到位,或者八九不离十才可以对于随时变化的情况进行分析,如果到家,还可以对别人或自己的进行优化。 如果你在这篇没有找到你想要的,请点击:java如何调用接口方式二 而对于一些知识

    04-27java调用接口的方法

    阅读更多
  • java如何定义数组

    Java中数组定义的三种方式 1.先声明 2.分配空间 3.赋值 public class arr{ public static void main(String[] args){ int[] arr; //先声明 arr=new int[5]; //分配空间 for(int i=0;i5;i++)arr[i]=i*10; //赋值 for(int i=0;i5;i++){ System.out.println(arr[+i+]=+arr[i]); } }} 结果: 方法二: 1.声明并分配空间 2.赋值

    04-27java定义数组方法

    阅读更多
  • Java JDK8 学习笔记

    Java JDK8 学习笔记

    本书针对Java SE 8新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新,详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对照关系,从Java SE API的源代码分析,了解各种语法在Java SE API中的具体应用

    大小:92.3 MBJava

    点击下载
  • Java设计模式深入研究

    Java设计模式深入研究

    《Java设计模式深入研究》对高级程序员、软件工程师、系统架构师等专业研究人员也具有一定的参考价值。 Java设计模式深入研究 第1章 接口与抽象类 第2章 反射 第3章 工厂模式 第4章 生成器

    大小:49.2 MBJava

    点击下载
  • Head First JavaScript程序设计

    Head First JavaScript程序设计

    大小:71.2 MBJavaScript

    点击下载
  • 2019校招面java试题库(含答案解析)

    2019校招面java试题库(含答案解析)

    本题库均来自海量真实校招面试题目大数据进行的整理,内含解析和答案,需要严肃说明的是:面试题库作为帮助同学准备面试的辅助资料,但是绝对不能作为备考唯 一途径,因为面试是一个考察真实水平的,不是背会了答案就可以的,需要你透彻理解的,否则追问问题答不出来反而减分,毕竟技术面试中面试官最痛恨的就是背答案这个事情了。 学完这个题库,把此题库都理解透彻应对各家企业面试完全没有问题。(当然,要加上好的 项目以及透彻掌

    大小:2.03 MBjava面试

    点击下载
  • Java开发实例大全(提高卷)

    Java开发实例大全(提高卷)

    汇集了Java开发从基础知识到高级应用各个层面的大量实例及源代码,45个方向,1201个实例案例,java编程类四库全书,供学习、速查、实践练习的超全参考手册,是《java开发实战1200例》之全新升级

    大小:162.8 MBJava编程

    点击下载
  • Java并发编程的艺术

    Java并发编程的艺术

    大小:148 MBJava编程

    点击下载
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)

    深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)

    (1)这本书值得全部Java技术人员读3遍,值得Java技术人员读3遍,值得读3遍! (2)依据JDK12和JDK13EA版本全方位升级,增加內容近50%,并对第二版中模棱两可、缺陷和不正确內容开展了调整 。 (3)计算机图书行业的永远的丰碑,前两版总计包装印刷36次,销售量超出三十万册,俩家网店评价总数超出90000条,內容近乎零恶意差评。 (4)从Java技术性管理体系、全自动代码优化、vm虚拟机实行分系统、程序流程编译器与代码设计、高效率高并发五个层面全

    大小:38 MBJava虚拟机

    点击下载
  • Java编程实战宝典

    Java编程实战宝典

    这是一本百科全书式的Java编程秘笈,以J2SE为平台,以新的JDK1.7技术规范为切入点,全面、系统地介绍了Java的基础编程技术和常用开发方法,实例丰富,特别适合想全面自学Java开发技术的人员阅读

    大小:154.4 MBJava

    点击下载
  • 阿里巴巴Java开发手册

    阿里巴巴Java开发手册

    这本书愿景是码出高效,码出质量,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和实践,适合计算机相关行业的管理者和研发人员、高等院校的计算机专业师生、求职者等阅读

    大小:27.5 MBJava开发

    点击下载
  • Java Web轻量级开发面试教程

    Java Web轻量级开发面试教程

    本书围绕软件公司对高级程序员的平均标准要求,构建了Java Web方面的高级程序员的进阶体系,以及在面试时如何高效地介绍自己项目经验的方法,适合想从事软件行业的在校学生、正在找工作

    大小:49.5 MBJava

    点击下载

学习笔记

9小时23分钟前回答

浅析Java垃圾回收机制

本教程是为了理解基本的Java垃圾回收以及它是如何工作的。这是垃圾回收教程系列的第二部分。希望你已经读过了第一部分:《 简单介绍Java垃圾回收机制 》。 Java垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序员在程序中分配和释放内存资源的开销。 启动Java垃圾回收 作为一个自动的过程,程序员不需要在代码中显示地启动垃圾回收过程。System.gc()和Runtime.gc()用来请求JVM启动垃圾回收。 虽然这个请求机制提供给程序员一个启动GC过程的机会,但是启动由JVM负责。JVM可以拒绝这个请求,所以并不保证这些调用都将执行垃圾回收。启动时机的选择由……

1小时1分钟前回答

关于java遍历机制性能的比较示例代码

缘由 近段时间在写leetcode的Lemonade Change时候,发现了for循环与forEach循环的耗时是不一致的,在提交记录上面差了一倍...... 平常开发绝大部分业务逻辑的实现都需要遍历机制的帮忙,虽说也有注意到各数据结构操作的性能比较,但是忽视了遍历机制性能的差异。原本前两天就开始动手写,拖延症...... 正文 现阶段我所知道JAVA遍历机制有三种 for循环 forEach循环 Iterator循环 JAVA数据结构千千万,但是大部分都是对基础数据结构的封装,比较HashMap依赖于Node数组,LinkedList底层是链表,ArrayList对数组的再封装......扯远了 总结来说,JAVA的基础数据结构,我觉得有两种 数组 链表 如果是加上Hash(Hash的操作与数组以及……

31小时4分钟前回答

java异常与处理机制分析

本文实例讲述了java的异常与处理机制。分享给大家供大家参考,具体如下: java的异常机制 Throwable类 Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。 Throwable又派生出Error类和Exception类。 错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。 异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使……

2小时46分钟前回答

java垃圾回收机制原理知识点详解

说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。 顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为垃圾?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题。以下是本文的目录大纲: 如何确定某个对象是垃圾? 典型的垃圾收集算法 典型的垃圾收集器 一.如何确定某个对象是垃圾? 在这一小节我们先了解一个最基本的问题:如果……