《深入理解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虚拟机》读书笔记四 【垃圾收集算法和垃圾收集器】

垃圾收集算法 垃圾收集器 内存分配

《深入理解Java虚拟机》读书笔记3——类文件结构

1.Class类文件的结构        根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要以这...

垃圾收集算法与内存分配策略--《深入理解Java虚拟机》学习笔记

垃圾收集算法与内存分配策略–《深入理解Java虚拟机》学习笔记一、对象存活算法判定1、何为引用 如果reference类型的数据中存储的数值代表另一块内存的起始地址,则称这块内存代表着一个引用;有一...

深入理解java虚拟机读书笔记-3.6内存分配与回收策略

一、概述 本文属于 《深入理解java虚拟机》读书笔记系列,第3章介绍了垃圾收集器与内存分配策略。其中垃圾收集器与收集算法,可以参照之前整理的文章,本文属于原书3.6部分章节。 Java技术体系中...

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

第l章走近 Java     世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 1.1.概述     Java 不仅仅是一门编程语言,还是一个自一系列计算...

《深入理解java虚拟机》学习笔记3——垃圾回收算法

Java虚拟机的内存区域中,程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭;栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构...

深入理解Java虚拟机笔记---垃圾收集器

原文请点击链接:链接 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对象垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的收...

读书笔记-《深入理解Java虚拟机》-对象探秘

版权声明:本文来自 Crocutax 的博客 , 转载请注明出处 http://crocutax.com Java是一门面向对象编程的语言,在Java程序运行过程中无时无刻都有对象被创建出来,那么在虚...

《深入理解Java虚拟机》读书笔记-第二章

在对Jvm底层的认知中看了不少的博客,里面内容参差不齐,终于在读了《深入理解Java虚拟机》后有了系统的认识,也发现在学习中百度搜索或者博客内容很重要但是要深入了解还是需要从书中获取,毕竟每个人对知识...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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