1 JVM的内存模型

1.1 堆空间

每个jvm都有一个堆,所有的对象都放在这里。

1.2 java栈空间

每个线程都有一个java栈,所有的java栈都放在这里。

1.3 本地方法栈

每个线程都有一个本地方法栈。

1.4 pc寄存器

每个线程都有一个pc寄存器。

1.5 方法存储区

每个jvm只有一个方法存储区,方法名、类的全路径名等。

1.6 类的静态变量是存放在堆空间中的

类的静态变量是存放在该类的class对象中,而class对象是存放在堆中的。

1.7 字符串常量池

jvm单独维护了一个常量池,用来存放所有的字符串常量,它本质上是一个hash table,大小固定。

jdk6的时候,该字符串常量池是存放在方法区中的,jdk7的时候,该字符串常量池存放在堆中。

如果一个java程序字符串太多,会导致hash table中的冲突过多,导致访问变慢,影响性能。

2 JVM的类加载器

2.1 JVM类加载器的构成

JVM有三个类加载器:

引导类加载器,负载加载核心类,即在JAVA_HOME/jre/lib下的类。

扩展类加载器,负责加载扩展类,即在JAVA_HOME/jre/lib/ext下的类。

应用类加载器,负责加载应用程序自身的类。

2.2 JVM类加载器的工作过程

jvm的类加载器是分等级的,引导类加载器的等级最高,地位最高,扩展类加载器次之,应用类加载器最低。

加载一个类的时候,地位低的加载器先请求地位高的加载器先加载,只有地位高的不能加载时,才由地位低的类加载器加载。

这样就保证了核心类的地位。

2.3 JVM类加载器工作的结果

第一步,加载

加载.class文件,生成二进制数据,并且保存在方法存储区。

第二步,链接

链接的时候要做的有三件事情,核实类的正确性、为类的变量分配存储空间并且赋值为默认值、符号解析。所谓的符号解析就是通过搜索方法存储区,将symbol换成引用。这样就完成了多个.class文件之间的链接。

第三步,初始化

对方法区中的类的静态变量赋值。

3 JVM的执行引擎

3.1 每个线程都是JVM执行引擎的一个实例

这样的话,各个线程之间都是独立的,互不影响。最直观的对JVM执行引擎的理解:芯片中如果直接支持bytecode的话,执行引擎就是线程本身了。

3.2 引擎工作的过程

3.2.1 解释器

bytecode由opcode和oprand构成,它根据bytecode指令取oprand,然后根据opcode执行相应的操作,具体执行的时候肯定是翻译成本地的二进制指令来执行的。

3.2.2 just in time compiler

将经常调用的方法事先编译成本地的二进制指令,下次再碰到直接调用即可。

3.2.3 芯片级别支持bytecode

直接执行bytecode,bytecode指令就是本地指令。

4 类加载器和执行引擎的关系

类加载器已经生成了java应用程序的所有的bytecode,执行引擎就按照bytecode的顺序解释执行即可。

JVM架构的更多相关文章

  1. JVM 架构解读

    每个Java开发人员都知道字节码由JRE(Java运行时环境)执行.但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它.作为开发人员,我们应 ...

  2. 【转】JVM 架构解读

    每个Java开发人员都知道字节码由JRE(Java运行时环境)执行.但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它.作为开发人员,我们应 ...

  3. [转]一图读懂JVM架构解析

    每个Java开发人员都知道字节码经由JRE(Java运行时环境)执行.但他们或许不知道JRE其实是由Java虚拟机(JVM)实现,JVM分析字节码,解释并执行它.作为开发人员,了解JVM的架构是非常重 ...

  4. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  5. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  6. JVM架构和GC垃圾回收机制详解

    JVM架构图分析 下图:参考网络+书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看:Hadoop内存溢出(OOM)分类.参数调优化) JVM被分为三个主要的子系统 (1)类加载器子系统(2)运行 ...

  7. JVM系列之一:JVM架构

    1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...

  8. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  9. [转载+整理]JVM性能调优----JVM架构

    JVM的总体结构参考如下两图:

  10. JVM架构_XmnXmsXmxXss有什么区别:转

    1.XmnXmsXmxXss有什么区别 首先,Xmn.Xms.Xmx.Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果. 了解jvm内存管理看这里:jvm ...

随机推荐

  1. java was started but returned exit code =-805306369的处理方法

    Myeclipse出现java was started but returned exit code =-805306369的错误,如图: 解决方法: 换个workspaces:换个工作目录,估计估计 ...

  2. 五、面向切面的spring(1)

    spring的依赖注入看完了,接下来是spring中与DI一并重要的AOP了,开始吧,GO. 在软件开发中,散布于应用中多处的功能被称为横切发关注点,通常来讲,这些横切关注点从概念上市与应用的业务逻辑 ...

  3. Python关于函数作为返回值的理解(3分钟就看完了)

    话不多说,直接看例子,上代码: def line_conf(): def line(x): return 2 * x + 1 return line #return a function object ...

  4. LeetCode(61) Rotate List

    题目 Given a list, rotate the list to the right by k places, where k is non-negative. For example: Giv ...

  5. LeetCode 167. Two Sum II – Input array is sorted

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  6. 第一个web项目

    1)       创建Java Web Project 2)       创建相应的包 3)       创建类并继承于HttpServlet 4)       重写service()方法 5)    ...

  7. python +selenium的 里面还自带case 然后也有生成报告的模板

    https://github.com/huahuijay/python-selenium2这个就是 python +selenium的  里面还自带case  然后也有生成报告的模板 

  8. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  9. Swoole 入门学习(二)

    Swoole 入门学习 swoole 之 定时器 循环触发:swoole_timer_tick    (和js的setintval类似) 参数1:int $after_time_ms 指定时间[毫秒] ...

  10. SOJ 4454 (矩阵快速幂)

    先引入数的快速幂 例如计算2的5次方,常规算法2*2*2*2*2,利用快速幂的思想,求出5的二进制表达式101,权值为1和4的位上数字为1,即2^5=2^1*2^4.代码如下,时间复杂度为O(logn ...