老李分享:jvm结构简介 1
老李分享:jvm结构简介
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。
JVM简介
一.介绍:
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的)执行。这就是Java的能够“一次编译,到处运行”的原因。
二.结构:

|
Tips: jvm相当于一个新的系统级软件
|
特点
2.1 Class Loader Subsystem :java编译的class文件加载器.
主要用来将*.class文件读取到jvm的内存中(就是方法区)
2.2 Runtime Data Areas :允许时数据存储区
里面的不同部分都是用来保存java程序运行时的程序信息<数据+指令>
2.2.1 Method area:方法区(jdk1.8 取消了方法区合)
当class文件加载器加载了*.class文件后,这个文件的 类信息,常量,静态变量,即时编译后(jit)的代码.
a.特点:线程共享(由于保存的都是一些不可变信息)
b.保存信息格式:
1) 类(文件)class:
a. 类及其父类全限定名 (java.lang.Object没有父类)
b. 类的类型 class 、 interface
c. 修饰符 public、protected、private
d. 实现接口的全限定名的列表 实现的接口列表
e. 常量池(final staic) 主要:string(使用final staic char[]实现的)||emun
f. 字段信息
g. 方法信息
h. 出常量外的静态变量 static的method,class
i. Classloader引用
j. Class 引用
Tips:全限定名:完整的class地址 Eg:在org.spring.web包下的annotation.class其权限名:org.spring.web. annotation.class
2) 字段field:
a. 字段名
b. 字段类型 类型使用全限定名
c. 字段修饰符 基本类型和对象
a) 访问修饰: public、private、protected
b) 静态: static
c) 常量: final
d) Jndi: transient
e) 线程: volatitile
3) 方法method:
a) 方法名: 全限定名
b) 返回类型: 全限定名
c) 参数信息: 参数列表:由全限定名
d) 修饰符:
a) 访问修饰: public、private、protected
b) 静态: static
c) 常量: final
d) 线程: synchronized
e) 本地: native
f) 抽象: abstract
如果不是native和abstract还会保存一下信息
1. 方法的字节码
2. 本变量表和操作数栈的大小
3. 异常表
c.String常量池:
2.2.2 Heap堆
存放数组和对象实例(new)的地方,gc的主要区域。
主要分区
| 名称 | 个数 | 大小比(default) |
| 年轻代 | 1 | 4 |
| 年老代 | 1 | 1 |
年轻代
| 名称 | 个数 | 大小(default) |
| eden区 | 1 | 8 |
| survivor区 | 2 | 2 |
直接内存:
调用本地库来操作分配系统的内存
对象访问:
这是堆的主要功能,每次new都会分配一个对象大小的内存空间。并且在java栈中有一个这个对象的引用。还可以通过这个引用查找存放在method area区的对象文件(.class)的所有信息<也就是其类的信息>。
Reference在Java虚拟机中定义为指向对象的引用
1.一种实现是Reference直接存储对象在堆内的地址,对象的类型信息可以在对象在堆中的内存布局中存储,如存储在对象内存的开头等。
2.另一种实现是Reference指向一个句柄表中的一个位置,句柄中保存了对象的实际位置及它对应的类型信息。使用句柄的好处是当在内存中移动对象的位置时,只需要更新句柄表中的内容,不需要改变引用值,但会多一次内存访问开销,直接引用的优缺点与此相反。
2.2.3 Native method stack:本地方法栈
执行本地方法。
例如:系统的文件系统,系统的网络系统。
老李分享:jvm结构简介 1的更多相关文章
- 老李分享:jvm结构简介 2
2.2.4 Program counter regsiters:程序计数器 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当 ...
- 老李分享:jvm垃圾回收
老李分享:jvm垃圾回收 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478 ...
- 老李分享:jvm内存原型剖析
老李分享:jvm内存原型剖析 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...
- 老李分享:JVM调优
老李分享:JVM调优 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...
- Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...
- 老李分享:持续集成学好jenkins之安装
老李分享:持续集成学好jenkins之安装 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- 老李分享: JSON
老李分享: JSON poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478, ...
- 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具
老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...
- 老李分享:pep8 python代码规范
老李分享:pep8 python代码规范 什么是PEPPEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书 . PEP8 译者:本文基于 20 ...
随机推荐
- kbhit()的三个测试
#include <stdio.h> #include<conio.h> #include<stdlib.h> int main() { ; system(&quo ...
- linux下php调试工具xdebug安装配置
xdebug简介 Xdebug是php的一款调试工具,是基于zend的一个扩展,可以用来跟踪,调试和分析PHP程序的运行状况.如变量,函数调试,性能监测,代码覆盖率等 xdebug安装 1.下载xde ...
- map,set,list等集合解析以及HashMap,LinkedHashMap,TreeMap等该选谁的的区别
前言: 今天在整理一些资料时,想起了map,set,list等集合,于是就做些笔记,提供给大家学习参考以及自己日后回顾. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允 ...
- java与javac的区别
1.前提:java分为两部分 一个是编译(javac命令),一个是运行(java命令) 2.java与javac的区别 javac负责的是编译,将.java文件编译成.class文件,当执行javac ...
- Laravel 开发笔记
Laravel 4.2 鉴权使用加盐密码 刚开始接触laravel,发现laravel默认的鉴权模块密码并未加盐处理(密码由password_hash方法创建).所以自己琢磨着对密码加盐.像下面这样 ...
- i++与++i陷阱
对于++i与i++编程必不可少,它们的区别:一般人只知道++i是先将i加一再进行其他操作,i++是先将i进行其他操作,再将其加一. 但是对于i++其中的执行过程,语言环境很关键.先来两个程序,看结果是 ...
- Ichars制作数据统计图
数据统计图基本上每个网站的后台都要做,不仅要做还要的非常详细才行,这样才能全面的具体的了解网站数据.之前用的jfreechart没有iChartjs用着方便,也没有iChartjs的效果炫,所以果断弃 ...
- 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 概念简介
什么是桌面虚拟化? 桌面虚拟化有很多概念,此处谈论的,是指的一般企业使用的“服务器 + 虚拟机 + 云终端”的方式来实现的. 桌面虚拟化的原理是什么? 桌面虚拟化看上去高大上,实际上原理非常的简单.拿 ...
- SQL_Join 小总结
原文出自 :http://www.nowamagic.net/librarys/veda/detail/936 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多in ...
- QtQuick 中的 qml 与 Qt 的 C++
QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便. 在 Qt 中使用 C++ 开发底层,QtQuick 用来加载.处理图像,然后使用 Qt 提供的接口 ...