一、JVM的概念

  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

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

二、JDK、JRE和JVM的区别

  JDK:编译、调试java程序用的开发工具包。包含JRE、JVM以及常用的开发工具,如javac java jconsole等。

  JRE:Java的运行环境。

  JVM:JRE的一部分,把编译好的class文件解析执行,调用操作系统的本地方法,通过执行引擎翻译成不同平台机器码,在特定平台运行。

三、JVM的运行流程

  

四、JVM的生命周期

  1.启动:main方法是jvm实例运行的起点 

  2.运行:main()作为程序初始线程的起点,任何其他线程都是由该线程负责启动,main线程是非守护线程

  3.消亡:所有的非守护线程都终止时;调用System.exit();

五、JVM的结构

  

  JVM组成:

    类加载器(class loader):只负责class文件的加载,至于它是否可以运行,则由执行引擎决定。

    执行引擎(Execution Engine):class文件被加载后,会把指令和数据信息放入内存中,执行引擎则负责把这些命令解释给操作系统。

    运行时数据区(Runtime Data Area):包含堆、JVM栈、本地方法栈、方法区、PC寄存器(程序计数器)。

    本地库接口(Native Interface):调用不同语言的接口给JAVA用,会在本地方法栈中记录对应的本地方法,然后调用该方法时就通过执行引擎加载对应的本地lib。

六、类加载器(classLoader)

  1.概念:负责加载字节码到jvm中,根据类中定义的内容分配到不同的运行时数据区。

  2.分类:

   Bootstrap ClassLoader:classLoader的根,rt.jar

   Extension ClassLoader

   Application ClassLoader

     用户自定义类加载器

  3.加载过程

    1).加载

    负责找到class文件,并加载到jvm中

     2).连接

    校验:确保类的格式正确

    准备:为类中的变量分配内存空间,并初始化默认值

    解析:符号引用转换为直接引用

     3).初始化: 执行静态代码块,构造器,静态属性。在调用new(), 反射调用类中的方法,子类调用初始化函数来初始化。

七、JVM运行时数据区

1.堆(Heap)

  它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。jvm只有一个堆区(heap)被所有线程共享,堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

2.JVM栈(Stack)

  参考:http://www.cnblogs.com/yyyyy5101/archive/2011/03/23/1992296.html

  开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里。

  VM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。

  Java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况。

  栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。

  栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。

  局部变量区被组织为以一个字长为单位、从0开始计数的数组,类型为short、byte和char的值在存入数组前要被转换成int值,而long和 double在数组中占据连续的两项,在访问局部变量中的long或double时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量 区中占据的索引时3、4项,取值时,指令只需取索引为3的long值即可。

  操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。

3.本地方法栈

  JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

4.方法区

  方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

  1) 类信息:类的全路径名,父类的全路径名,类型是接口还是类,类的修饰符(public,private,abstract,final)

  2) 字段信息:字段名,字段类型,字段修饰符(public,private,protected,static,final,volatile)

  3) 方法信息:方法名,方法的返回类型(String,void等),方法参数的类型、数目以及顺序,方法修饰符(public,private,protected,static,final,synchronized,native,abstract)

  4) 类变量信息(静态变量)

  5) ClassLoader引用:通过类加载器加载的对象类型,JVM必须存储对类的引用,而这些针对类加载器的引用是作为了方法区里面的类型数据部分进行存储的。

5.PC寄存器

  PC寄存器是用于存储每个线程下一步将执行的JVM指令,若该方法为native的,则PC寄存器中不存储任何信息。

八、参考

  JVM介绍

  

JVM优化(一)-- 入门的更多相关文章

  1. 想写一篇jvm的工具入门

    为什么要写一个jvm的工具入门呢,一是自己也不会,二是因为不会所以想学一下,还有就是这个确实很重要,对学习jvm有很多的用处,对定位问题有很大的便利,以前毕业那会我记得有个笔试,知道JAVA_HOME ...

  2. JVM优化

    1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...

  3. JVM 优化问题

    jvm 优化问题 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  4. 给hive的metastore做JVM优化

    最近在测试环境下,hive的metastore不稳定,于是做一次JVM优化 在hive-env.sh中 export HADOOP_HOME=/opt/cdh/hadoop-2.6.0-cdh5.14 ...

  5. linux下jvm优化、tomcat调优

    系统环境:jdk1.8,apache-tomcat-8.5.35 一.jvm优化 进入 bin/catalina.sh,修改JAVA_OPTS配置: JAVA_OPTS="-server - ...

  6. 性能优化系列三:JVM优化

    一.几个基本概念 GCRoots对象都有哪些 所有正在运行的线程的栈上的引用变量.所有的全局变量.所有ClassLoader... 1.System Class.2.JNI Local3.JNI Gl ...

  7. 系统优化怎么做-JVM优化之VisualVM

    大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...

  8. 多核服务器的JVM优化选项(转载)

    原文链接 现在多核CPU是主流.利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集.但是Java利用多核技术也带来了一些问题,主要是多线程共享内存引起了.目前内存 ...

  9. JVM 优化之逃逸分析

    整理自 周志明<深入JVM> 1, 是JVM优化技术,它不是直接优化手段,而是为其它优化手段提供依据. 2,逃逸分析主要就是分析对象的动态作用域. 3,逃逸有两种:方法逃逸和线程逃逸.   ...

  10. java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置

    过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...

随机推荐

  1. centos7搭建python3并和python2共存

    注意事项:1.非root帐号加上sudo2.centos7自带Python 2.7.5是不能卸载的,很多系统级软件依赖这个 安装依赖# yum -y groupinstall "Develo ...

  2. 一款由html5 canvas实现五彩小圆圈背景特效

    之前介绍了好几款html5 canvas实现的特效.今天要为大家介绍一款由html5 canvas实现五彩小圆圈背景特效.五彩的小圆圈渐显渐失的特效.效果图如下: 在线预览   源码下载 html代码 ...

  3. git工作流教程

    简介:在用git进行开发时,需要规范化,这时用git工作流来规范化,软件开发过程 https://github.com/oldratlee/translations/blob/master/git-w ...

  4. RabbitMQ(二):mandatory标志的作用

    本文转自:http://m.blog.csdn.net/article/details?id=54311277 在生产者通过channel的basicPublish方法发布消息时,通常有几个参数需要设 ...

  5. Logback手冊 Chapter 1: Introduction

    翻译不周,多多包括 ---------------------------------------------------------------------------------------切割线 ...

  6. c#利用反射Assembly 对类和成员属性进行操作

    protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...

  7. Makefile 编译动态库文件及链接动态库

    本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...

  8. Remote Desktop Connection没法全屏解决方案

    Remote Desktop Connection无法全屏解决方案Sometimes, Remote Desktop Connection总是一个窗口,不自动全屏,任务栏不能自动隐藏起来,要拖动滚动条 ...

  9. (转)kafka发布消息报错LEADER_NOT_AVAILABLE

    今天居然碰到这个错误,参考以下解决方案: $ bin/kafka-console-producer.sh --broker-list="192.168.1.100:32785" - ...

  10. git中文乱码解决方案

    解决方案: 在bash提示符下输入: git config --global core.quotepath false core.quotepath设为false的话,就不会对0x80以上的字符进行q ...