深入Java虚拟机读书笔记

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

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

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

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

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

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

[b][size=medium]3. Java虚拟机的体系结构[/size][/b]
[color=blue]虚拟机抽象结构图,描述了规范中的主要子系统和内存区。[/color]
[img]http://dl.iteye.com/upload/attachment/257279/0dce4093-aa45-3022-b47e-635aa1d48863.jpg[/img]

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

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

[b][color=blue]数据类型[/color][/b]
Java中数据类型分为两种:
1)基本类型:数值类型(整数与浮点数)、boolean、returnAddress(只在JVM内部使用的类型,用来实现finally子句,具体没深入研究)
2)引用类型:类类型、接口类型、数组类型、以及null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值