`
linliuwei
  • 浏览: 33175 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入Java虚拟机读书笔记

阅读更多
深入Java虚拟机一书读书笔记,以前虽然断断续续的了解过虚拟机,但不够系统化,这次好好系统的学习回顾和总结一篇

1. Java虚拟机是什么
Java虚拟机一般是指:抽象的规范、一个具体的实现、一个运行中的虚拟机实例。

这个抽象的规范可能有多个不同厂商的具体实现,并存在与多个平台上。它可以由软件实现,或以硬件结合软件的方式实现,SUN的JDK就是由纯软件方式实现的。当运行一个Java程序时,也就在运行了一个Java虚拟机实例。

2. Java虚拟机的生命周期
Java虚拟机实例通过调用某个初始化类的Main()方法,来开始运行一个Java程序。这个初始化类的Main()方法,将作为该程序初始线程的起点,任何其他的线程都从这个初始线程中启动的。

Java虚拟机内部有两种线程:守护线程与非守护线程。守护线程通常是由虚拟机自己使用的,如执行垃圾回收任务的线程。但是在Java程序中也可以把它创建的任何一个线程标记守护线程来运行。开始于Main()方法的初始线程就是非守护线程。

在Java虚拟机中只要有任何一个非守护线程在运行,那这个Java虚拟机实例就将一直存活,直到该虚拟机中的所有非守护线程都终止时,这个虚拟机实例才会被销毁。

3. Java虚拟机的体系结构
虚拟机抽象结构图,描述了规范中的主要子系统和内存区。


线程共享区“堆”与“方法区”
在虚拟机中“堆”与“方法区”是由所有线程共享的。当类加载器加载一个class文件时,它将从class文件中分析出类型信息,然后把这些类型信息存放到“方法区”中,程序运行时,虚拟机会把该程序在运行时创建的对象都存放到“堆”中。
小结:
1)类变量都是存放在“堆”中,因而需要同步多线程环境下的读写操作
2)一个Java虚拟机实例只存在一个“堆”空间


线程独享区“Java栈”、“本地方法栈”与“PC寄存器”
每当启动一个新线程时,虚拟机都会为它分配一个Java栈与PC寄存器(程序计数器)。每个Java栈是由许多栈帧(stack frame)组成的,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的栈帧到栈中。当方法返回时,这个栈帧将从栈中弹出并抛弃。
小结:
1)Java栈上的所有数据都是私有的,任何线程都不能访问另一个线程的栈数据,因此不需要考虑多线程环境下的同步问题。
2)Java栈以帧为单位保存线程的运行状态,虚拟机只会对Java栈执行两种操作:以帧为单位的压栈或出栈。
3)栈帧由三部分组成:局部变量区、操作数栈、帧数据区。
4)栈空间随着线程的终止而释放,如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出StackOverflowError异常,这种情况一般是无线循环或死递归造成的。
5)Java虚拟机没有寄存器,这里PC寄存器是由底层操作系统分配的。


数据类型
Java中数据类型分为两种:
1)基本类型:数值类型(整数与浮点数)、boolean、returnAddress(只在JVM内部使用的类型,用来实现finally子句,具体没深入研究)
2)引用类型:类类型、接口类型、数组类型、以及null






  • 大小: 51.7 KB
  • 大小: 33.5 KB
  • 大小: 21.7 KB
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics