Java虚拟机(Java Virtual Machine)
JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西。只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行。所以,Java语言的平台无关性,实际上是因为有不同平台下的JVM的支持。
自动内存管理机制
Java程序的内存分配由JVM管理,所管理的内存划分为5个不同的数据区域。自动内存管理可归结为解决两个问题:给对象分配内存以及回收分配给对象内存。

程序计数器
用途:当前线程所执行的字节码的行号指示器。
生命周期:与线程相同。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。(线程私有)
虚拟机栈
用途:描述Java方法执行内存模型:每个方法执行会创建一个栈帧入栈,用来存储局部变量表、操作数栈、动态链接、方法出口等信息,方法执行完成时出栈。
生命周期:与线程相同。(线程私有)
本地方法栈
用途:与虚拟机栈类似,给Native方法使用。(线程私有)
生命周期:与线程相同。(线程私有)
堆区
用途:存放对象实例。
生命周期:虚拟机启动时创建。(线程共享)
设置大小:-Xmx和-Xms。
方法区
用途:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
给对象分配内存
以HotSpot虚拟机为例
对象的创建
1、查找对应类的符号引用,没有则加载相应的类。
2、分配内存给新对象。
3、初始化零值。
4、设置对象头信息。(类元数据信息、哈希码等)。
5、初始化对象。
对象的内存布局
1、对象头:存储对象自身的运行时数据,如哈希码、线程持有的锁、GC分代年龄等。
2、实例数据:程序中定义的各种类型的字段内容。
3、对齐填充:起占位符作用,为满足对象起始地址是8字节的整数倍。
对象的访问定位
使用直接指针访问方式,即堆对象的引用直接指向对象地址。
回收分配给对象内存
垃圾收集(Garbage Collection,GC),上面三个线程私有区域在线程结束时内存就随着回收了,所以垃圾回收一般指的是堆区和方法区。
何时回收?
判断对象是存活还是死去,常有两种方法。
一、引用计数算法
给对象中添加一个引用计数器,每当一个地方引用它就加1,引用失效则减1,计数器为0则对象已死。但是Java虚拟机不是用这种,最主要原因是很难解决对象的循环引用问题。
二、可达性分析算法
通过一系列“GC Roots”的对象作为起始点,往下搜索引用对象,搜索所经过的路径称为引用链,当一个对象不在任何一个引用链上时,则该对象已死。(Java虚拟机用这种)
GC Roots的对象包括:
1、虚拟机栈中引用的对象。
2、方法区中类静态属性或常量引用的对象。
3、本地方法栈中JNI引用的对象。
如何回收?
不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,这一块内容就不多深入。
虚拟机性能监控与故障处理工具
JDK的命令行工具
jps:列出正在运行的虚拟机进程。
jstat:监视虚拟机各种运行状态信息。
jinfo:实时地查看和调整虚拟机各项参数。
jmap:生成堆的转储快照。
jhat:与jmap配和使用,分析jmap生成的堆转储快照。
jstack:生成虚拟机当前时刻的线程快照。
JDK可视化工具
JConsole:用来内存监控、线程监控。
VisualVM:强大的运行监控和故障处理程序,还有性能分析等功能。对性能影响小,可直接用于生产环境。
参考文献
1、《深入理解Java虚拟机》 by 周志明
Java虚拟机(Java Virtual Machine)的更多相关文章
- Java Language and Virtual Machine Specifications
The Java Language Specification, Java SE 8 Edition HTML | PDF The Java Virtual Machine Specification ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- Java虚拟机——Java内存区域与内存溢出
内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...
- 深入理解Java虚拟机 - Java体系
使用JAVA已经快三年了,但说来惭愧,一直以来认为Java就是Java语言本身,最多再包括一个JVM,对于整个Java的体系结构还是不甚明了,现在有时间把<深入理解Java虚拟机>这本书读 ...
- Java虚拟机-----------Java内存区域与内存溢出异常
Java内存区域划分 Java虚拟机运行时的数据区大致可划分为五部分:方法区,堆(两部分组成Java堆内存),虚拟机栈,本地方法栈(Java栈内存),程序计数器. 1.程序计数器 程序计数器占较小的内 ...
- 深入理解java虚拟机---java虚拟机内存管理(七)
本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...
- 深入理解java虚拟机---java虚拟机内存管理(六)
java虚拟机栈的理解 虚拟机栈就是我们所熟知的栈内存,栈内存属于线程独有的.而在栈内存中的局部变量表中存储的引用类型只是存储对象的内存地址.对象的创建在堆内存中,即对象在线程共享区中. 局部变量表: ...
- 深入理解java虚拟机---java虚拟机内存管理(五)
1.深入理解java虚拟机 总图: 1.线程共享区: 2.线程独占区: 1.程序计数器 理解为当前线程锁执行的字节码的行号指示器,程序计数器没有内存异常错误.
- 深入理解java虚拟机---java虚拟机的发展史(四)
1.java虚拟机 A:java虚拟机有很多个版本,但是我们经常使用的是sun公司的HotSpot,可以通过以下命令获取java虚拟机版本 B:JAVA虚拟机分类: 1.Sun Class VM 2. ...
- 深入理解java虚拟机----java技术体系(一)
1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...
随机推荐
- C#多线程的几种方法详解示例
这里主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧! 1 进程.线程.同步.异步的概念 2 回顾委托,开始异步 3 异步多线程的三大特点 异步多线程都觉得很厉害, ...
- Django 系列博客(六)
Django 系列博客(六) 前言 本篇博客介绍 Django 中的路由控制部分,一个网络请求首先到达的就是路由这部分,经过路由与视图层的映射关系再执行相应的代码逻辑并将结果返回给客户端. Djang ...
- ASP.NET资源大全-知识分享
API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...
- 【Linux命令】top命令
一.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. 二.使用 1.查看进程内线程情况 top -Hp 2556(2556为进程号)找 ...
- Javascript继承1:子类的的原型对象----类式继承
//声明父类 function Parent(){ this.parentValue = true; this.favorites = ['看书'] } //为父类添加公有方法 Parent.prot ...
- spring boot之hello
自己使用springboot也已经写过一段时间的代码,但是对springboot真正运行的流程还是有点模糊,今天写出自己对springboot的认识,如有不对,还请各位大佬不吝赐教,话不多说,直接上代 ...
- POJ 2407Relatives
Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15566 Accepted: 7900 Descri ...
- Windows下git设置代理服务器
SVN中,使用TortoiseSVN来进行版本控制时,设置代理非常简单,只需要在设置里面添加代理的信息即可.而 git 在GUI(v0.17.GITGUI)中却无法找到类似的设置,只能求助 git b ...
- css优先级计算规则——权重
一.css的优先级 当对同一个元素设置相同的多个声明时,会按照优先级的高低选择应用哪种声明. <style> #id{ color:red; } p{ color:blue; } < ...
- 【代码笔记】Web-Javascript-Javascript typeof
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...