《深入理解Java虚拟机》笔记一

原创 2015年11月18日 16:25:07

最近看了《深入理解Java虚拟机》,对java的了解多了些。提到java,脑子里的第一反应最起码不再是new class、加载包了。但更深的东西不敢说吸收了多少,同时也不是为了立志进行java虚拟机开发,只求多读几遍、逐步明智。

《一、Java技术体系》
1,传统意义的Java技术体系

传统意义的Java技术体系包括:Java程序设计语言、各种Java虚拟机、Class文件格式、Java API类库、第三方Java类库。

个人理解为,虚拟机只管执行Class文件格式的东西,各种类库即是主要是封闭好的常用class文件。Java程序设计语言方面的规范是供人们进行使用而最终开发生

成.class文件。
2,JDK和JRE

把Java程序设计语言、Java虚拟机、Java API这三部分称之为JDK(Java Development Kit,java开发组件),其为支持Java开发的最小环境。把Java SE API子集和Java虚拟机这二部分称之为JRE(Java Run Environment,JAVA运行环境),其为支持Java程序运行的标准环境。

从字面理解为,JDK就是一个最小单位的开发环境,而JRE就是一个最小单位的Java程序运行环境。

3,按照服务的领域划分
 有时以JDK代替整个Java技术体系,按照技术所服务的领域可划分为4个平台:Java Card(小内存设备上,java一开始是面向嵌入式开发的),Java ME( Micro Edition,面向移动终端的开发,如手机),JavaSE(Standard Edition,面向桌面级应用开发),JavaEE(Enterprise Edition,面向多层架构的企业应用开发)。

大学里java路线的学习,基本上是按照这个划分进行学习的:首先java基础学习,即针对JavaSE的深层次;后来学习jsp,struts,spring等,即针对JavaEE的学习。 

《二、Java运行时数据区》
此部分就是一个简短摘抄。虚拟机就是虚拟机,但是学过计算机组成原理的话,则对这部分的概念学习并不太难。整体结构如图:

1,程序计数器。当前线程所执行的字节码的行号指示器:如果线程正在执行一个Java方法,则记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是Native方法,则计数器值为空(undefined)。此内存区域是唯一一个Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2,虚拟机栈。与程序计数器一样,VM栈的生命周期也是与线程相同。VM栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。
3,本地方法栈。本地方法栈与VM栈所发挥作用是类似的,只不过VM栈为虚拟机运行VM原语服务,而本地方法栈是为虚拟机使用到的Native方法服务。它的实现的语言、方式与结构并没有强制规定,甚至有的虚拟机(譬如Sun Hotspot虚拟机)直接就把本地方法栈和VM栈合二为一。和VM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。
4,方法区。方法区中存放了每个Class的结构信息,包括常量池、字段描述、方法描述等等。VM Space描述中对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存,也可以选择固定大小或者可扩展外,甚至可以选择不实现垃圾收集。
5,堆。Java堆是被所有线程共享的,在虚拟机启动时创建。Java堆的唯一目的就是存放对象实例,绝大部分的对象实例都在这里分配。
6,直接内存。直接内存并不是虚拟机运行时数据区的一部分,它根本就是本机内存而不是VM直接管理的区域。但是这部分内存也会导致OutOfMemoryError异常出现。
    在JDK1.4中新加入了NIO类,引入一种基于渠道与缓冲区的I/O方式,它可以通过本机Native函数库直接分配本机内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显着提高性能,因为避免了在Java对和本机堆中来回复制数据。
    显然本机直接内存的分配不会受到Java堆大小的限制,但是即然是内存那肯定还是要受到本机物理内存(包括SWAP区或者Windows虚拟内存)的限制的,一般服务器管理员配置JVM参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),而导致动态扩展时出现OutOfMemoryError异常。

深入理解Java虚拟机 第2版笔记

  • 2017年12月03日 21:59
  • 77KB
  • 下载

深入理解Java虚拟机和读书笔记

  • 2017年05月04日 15:59
  • 50.53MB
  • 下载

深入理解Java虚拟机 读书笔记——垃圾收集器与内存分配策略

第3章 垃圾收集器与内存分配策略关于Java中的引用类型 强引用(Strong Reference):Object obj = new Object(); 这样的常规引用,只要引用还在,就永远不会回收...

深入理解java虚拟机-读书笔记6-程序编译与代码优化

早期(编译期)优化:javac把java文件转变成class文件,这类前段编译器堆代码的运行效率几乎没有任何优化措施,性能的优化集中到了后端的即时编译器中,但是javac针对java语言编码过程的优化...

深入理解Java虚拟机笔记---运行时栈帧结构

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作...

深入理解Java虚拟机(第一版)-第三章读书笔记

深入理解Java虚拟机(第一版)-第三章读书笔记

《深入理解Java虚拟机》笔记

“编好的机器指令”当然指的是能在CPU上运行的,如果这里我还实现了一个翻译机器:从自己定义的格式指令翻译到CPU指令,那么就可以执行根据自定义格式的代码了…… AD:2013云计算架构师峰会课程...
  • novelly
  • novelly
  • 2014年03月15日 00:18
  • 412

《深入理解JAVA虚拟机》笔记4——垃圾收集与内存分配策略

为什么要去了解GC和内存分配? 当需要排查各种内存溢出、内存泄漏时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些自动化的技术实施必要的监控和调节。 程序计数器、虚拟机栈、本地...
  • joshho
  • joshho
  • 2016年10月15日 14:25
  • 173

《深入理解JAVA虚拟机》笔记1

java程序运行时的内存空间,按照虚拟机规范有下面几项: (1)程序计数器          指示下条命令执行地址。当然是线程私有,不然线程怎么能并行的起来。 不重要,占内存很小,忽略不计。 (...

《深入理解java虚拟机》读书笔记

1. 运行时数据区域 1.1 程序技术器 可以看作是当前线程所执行的字节码的行号指示器,通过它来取下一条需要执行的指令。 线程私有内存。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深入理解Java虚拟机》笔记一
举报原因:
原因补充:

(最多只允许输入30个字)