• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java JVM原理与调优_动力节点Java学院整理

Java JVM原理与调优_动力节点Java学院整理

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了java jvm原理,java jvm是什么,java jvm调优,java jvm下载,java jvm面试题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。是运行Java应用最底层部分。

JDK(Java Development kit)

整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(编译,debug等)和Java基础的类库(rt.jar)。是开发java应用的基础。

JRE(Java Runtime Environment,Java运行环境)

运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。运行java应用的基础。

J2SE(Java 2 Platform,Standard Edition)。

包含那些构成Java语言核心的类。比如:数据库连接、接口定义、输入/输出、网络编程

J2EE(Java 2 Platform,Enterprise Edition)。

Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。比如:EJB、servlet、JSP、XML、事务控制。

主要JVM

首先,JVM是一套规范。很多公司均实现了各自的虚拟机。常见的有

HotSpot JVM(sun)
Jrockit JVM(BEA公司的JVM,应用于weblogic)
IBM JVM
Apache Harmony

其中,我们常用的是HotSpot JVM.

JVM结构

第一步(编译):

创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后 引用,这个有点象make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话 报“cant find symbol”的错误。

第二步(运行):

Java类运行的过程大概可分为两个过程:1、类的加载  2、类的执行。

需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。

1、 在 编译好java程序得到MainApp.class文件后,在命令行上敲java AppMain。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为AppMain.class的二进制文件,将 MainApp的类信息加载到运行时数据区的方法区内,这个过程叫做MainApp类的加载。

2、 (java命令)然后JVM找到AppMain的主函数入口,开始执行main函数

3、 (类加载器)执行过程中,会创建对象。JVM会首先从方法区加载类信息和相关常量,class加载完毕之后,在堆上为对象分配内存,然后调用初始化实例,当然这时候实例保持指向class类型信息,这个信息保存在方法区中。

4、 (执行引擎)调用实例方法时,会根据引用找到对象信息,进而可定位对应的class类型信息,和方法表。

5、 (执行引擎)执行方法时,在虚拟机栈中进行,分配栈帧,随着入栈出栈,完成方法调用操作。

执行引擎

运行Java的每一个线程都是一个独立的虚拟机执行引擎的实例。从线程生命周期的开始到结束,他要么在执行字节码,要么在执行本地方法。一个线程可能通过解释或者使用芯片级指令直接执行字节码,或者间接通过JIT执行编译过的本地代码。我们上文讲到的main函数,也就是执行引擎的操作入口。

Class文件

实际上,Class文件中方法的字节码流就是有JVM的指令序列构成的。每一条指令包含一个单字节的操作码,后面跟随0个或多个操作数。

iload_0    // 把存储在局部变量区中索引为0的整数压入操作数栈。
iload_1    // 把存储在局部变量区中索引为1的整数压入操作数栈。
iadd         // 从操作数栈中弹出两个整数相加,在将结果压入操作数栈。
istore_2   // 从操作数栈中弹出结果

JVM运行时数据区

1)程序计数器(线程私有)

当前线程所执行的字节码的行号指示器,通过改变这个计数器的值,确定下一条要执行的命令。分支,循环,跳转都需要它的支持。

它是线程私有的,每个线程都有专属于自己的程序记数器,线程之间互不影响,独立存储,保证了线程切换后,可以恢复到原先执行位置。

2)Java虚拟机栈(线程私有)

每个方法的执行,同时都会在虚拟机栈上创建一个栈帧。用于存储局部变量表,操作数栈,方法出口,动态链接等。一个方法的执行周期,同时也就对应着栈帧的出栈入栈操作。有时候方法的递归,会造成大量的栈帧,达到一定的深度,会报StackOverflowError异常。有一点需要说明:在编译器编译Java代码时,就已经在字节码中为每个方法都设置好了局部变量区和操作数栈的数据和大小。并在JVM首次加载方法所属的Class文件时, 就将这些数据放进了方法区。因此在线程调用方法时,只需要根据方法区中的局部变量区和操作数栈的大小来分配一个新的栈帧的内存大小,并堆入Java栈。

局部变量区: 用来存放方法中的所有局部变量值,包括传递的参数。这些数据会被组织成以一个字长(32bit或64bit)为单位的数组结构(以索引0开始)中。其中类 型为int, float, reference(引用类型,记录对象在堆中地址)和returnAddress(一种JVM内部使用的基本类型)的值占用1个字长,而byte, char和shot会扩大成1个字长存储,long,double则使用2个字长。

 操作数栈: 用来在执行指令的时候存储和使用中间结果数据。

帧数据区: 常量池的解析,正常方法返回以及异常派发机制的信息数据都存储在其中。

3)本地方法栈(线程私有)

与Java虚拟机栈类似,只不过该区域是为native方法提供服务。

4)方法区(Perm)(线程共享)

    存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。包含运行时常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容是在类加载后进入方法区运行时常量池中。

5)堆

堆是整个内存数据区最负责的部分,负责对象的创建。同时,垃圾回收的主要工作也在于此。堆又进一步进行细分,主要是为了满足垃圾回收。

堆的组成

Eden(伊甸园):对象创建的入口。

Survivor Space:用于保存在eden space内存池中经过垃圾回收后没有被回收的对象,也就是“幸存还活着”的对象。

幸存者0区(Survivor 0 space)和幸存者1区(Survivor1 space):当伊甸园的空间用完时,程序又需要创建对象;此时JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象 进行销毁工作。同时将伊甸园中的还有其他对象引用的对象移动到幸存者0区。幸存者0区就是用于存放伊甸园垃圾回收时所幸存下来的JAVA对象。

当将伊甸园中的还有其他对象引用的对象移动到幸存者0区时,如果幸存者0区也没有空间来存放这些对象时,JVM的垃圾回收器将对幸存者0区进行垃圾 回收处理,将幸存者0区中不在有其他对象引用的JAVA对象进行销毁,将幸存者0区中还有其他对象引用的对象移动到幸存者1区。幸存者1区的作用就是用于 存放幸存者0区垃圾回收处理所幸存下来的JAVA对象。

Tenured :对象经过survivor 1 space内存池,每经历过一次垃圾回收,年龄就增加1,超过设定阀值后,被移入终身代,当然也包括由于担保机制移入的对象。对于新生代和老年代,垃圾回收器对其态度不同。发生在新生代的回收频率频繁,大部分对象是“朝生夕死”,收集算法一般采用高效简单的复制算法,也就是上文描述的对象转移操作(Eden->survivor 0,survivor 0->survivor 1)。发生在该区域的垃圾回收为Young GC.对于老年代,由于大部分对象主要为存活率高的对象,垃圾回收器采用”标记-整理“算法。发生在该区域的垃圾回收为FULL GC.

堆相关参数

(影响堆空间划分,进而会影响GC发生频率)JVM调优工作,主要是基于这些参数,进行适当调整管理,达到调整堆内存大小及比例大小,以满足实际业务需求。另外还包括方法区。

-Xms:设置 Java 应用程序启动时的初始堆大小;
-Xmx:设置 Java 应用程序能获得的最大堆大小;
-Xss:设置线程栈的大小;
-XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当堆空间的空闲内存小于这个数值时,JVM 便会扩展堆空间;
-XX:MaxHeapFreeRatio:设置堆空间的最大空闲比例。当堆空间的空闲内存大于这个数值时,便会压缩堆空间,得到一个较小的堆;
-XX:NewSize:设置新生代的大小;
-XX:NewRatio:设置老年代与新生代的比例,它等于老年代大小除以新生代大小;
-XX:SurvivorRatio:新生代中 eden

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Java JVM原理与调优_动力节点Java学院整理
  • JVM教程之Java代码编译和执行的整个过程(二)
  • Java JVM虚拟机运行机制
  • Java JVM原理与调优_动力节点Java学院整理

相关文章

  • 2017-05-28java加载properties文件的六种方法总结
  • 2017-05-28Spring mvc整合mybatis(crud+分页插件)操作mysql
  • 2017-07-23Java并发编程实践:Callable异步回调Future、FutureTask用法
  • 2017-05-28Spring Data JPA 复杂/多条件组合分页查询
  • 2017-05-28JAVA线程sleep()和wait()详解及实例
  • 2017-05-28利用Java异常机制实现模拟借书系统
  • 2017-05-28xml与Java对象的转换详解
  • 2017-05-28Java Calendar类常用示例_动力节点Java学院整理
  • 2017-05-28Java中的== 和equals()方法详解与实例
  • 2017-05-28eclipse/intellij idea 查看java源码和注释方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Spring Boot无缝集成MongoDB
    • java 中Collection存储器详解及简单实例
    • Java 存储模型和共享对象详解
    • Java枚举类型enum的详解及使用
    • Java clone方法详解及简单实例
    • Java IO中字节流复制图片实现代码
    • SWT JFace Bookmark 制作
    • Java中利用gson解析Json实例教程
    • Java TokenProcessor令牌校验工具类
    • Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有