欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

程序员文章站 2022-07-09 14:21:43
第一部分 走进Java 一、走进Java 1、概述 java广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想 2、java技术体系结构 按照功能来划分 包括以下几个组成部分:Java程序设计语言,各种硬件平台的java虚拟机,Ja ......

第一部分 走进Java

一、走进Java

1、概述

  java广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想

2、java技术体系结构

  按照功能来划分

       包括以下几个组成部分:Java程序设计语言,各种硬件平台的java虚拟机,Java API类库,来自商业机构和开源社区的第三方Java类库,Class文件格式

  Java程序设计语言,java虚拟机,Java API类库统称为JDK,是用于支持java程序开发的最小环境

  Java API类库中的Java SE API子集和Java虚拟机统称为JRE,是支持java程序运行的基本环境

  按照技术所服务的领域划分分为4个平台

  Java Card:支持java小程序运行在java小内存设备(如智能卡)上的平台

  Java ME:支持Java程序运行在移动设备上的平台

  Java SE:支持面向桌面级应用的平台

  Java EE:支持使用多层架构的企业级应用的平台

第二部分  自动内存管理机制

二、内存区域和内存溢出异常

1、运行时数据区

  程序计数器:记录的是正在执行的虚拟机字节码指令的地址,可以看成是当前线程所执行的字节码的行号指示器,每个线程都有一个独立的程序计数器,各条线程的程序计数器互不影响,独立存储,这类内存区域成为“线程私有的内存”。

        此内存区域是唯一在虚拟机规范中没有OutOfMemoryError的情况的区域

  Java虚拟机栈:同程序计数器一样,也是线程私有的。每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,都对应着一个栈帧在虚拟机栈中入栈和出栈的过程。

         局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

         如果请求的栈深度超过虚拟机锁允许的深度,将抛出*Error异常。如果拓展无法申请到足够的内存,将抛出OutOfMemoryError异常。

  本地方法栈:为虚拟机使用的native方法服务,和虚拟机栈一样,本地方法栈也会抛出*Error和OutOfMemoryError异常。

  Java堆:Java堆是所有线程共享的一块内存区域,用来存放对象实例,几乎所有的对象实例都在这里分配。Java堆是垃圾回收的主要区域,采用分代收集算法。Java堆分为新生代和老年代,在细致一点分为Eden,From Survivor,To Survivor空间。

      如果堆中无法完成对象实例的内存分配,且堆也无法扩展时,将抛出OutOfMemoryError异常。

  方法区:是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,HotSpot虚拟机的设计团队把GC分代收集扩展至方法区,或者说使用永久代来代替方法区。

      在目前已经发布的JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出了。当方法区无法满足内存的分配需求时,将抛出OutOfMemoryError异常。

  运行时常量池: