素小暖讲JVM:第一章 走进Java,第二章 Java内存区域与内存溢出异常

本系列是用来记录《深刻理解Java虚拟机》这本书的读书笔记。方便本身查看,也方便你们查阅。多线程

欲速则不达,欲达则欲速!并发

第一章 走进Javajvm

1、Java虚拟机发展史优化

这部分一带而过吧,有兴趣的能够阅读原著!spa

2、Java内存管理,class文件结构与执行引擎,编译器优化,多线程并发的简单解释(后续章节详述)线程

  1. 自动内存管理讲的是Java运行时数据区里的部分分为内存划分和垃圾收集器
  2. 执行子系讲的是类文件管理、类加载机制、字节码执行引擎
  3. 优化分为编译器优化和运行期优化
  4. 并发讲的是虚拟机是如何实现多线程的

具体能够结合下面的jvm结构图来看,这张图是基于JDK1.7的。JDK1.7以前,常量池是存放在方法区中的,1.7以后常量池存放在堆中。3d

第二章 Java内存区域与内存溢出异常对象

1、运行时数据区域blog

一、程序计数器内存

程序计数器是一块较小的内存空间,它能够看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工做时就是经过改变这个计数器的值来选取下一条须要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都须要依赖这个计数器来完成。

因为Java虚拟机的多线程是经过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个肯定的时刻,一个处理器都会执行一条线程中的指令。所以,为了线程切换后能恢复到正确的执行位置,每条线程都须要有一个独立的程序计数器,各条线程之间互不影响,独立存储,咱们称之为线程私有的内存。此内存区域是Java虚拟机规范中惟一一个没有规定任何outOfMemoryError状况的区域。

二、Java虚拟机栈

Java虚拟机栈是线程私有的,它的声明周期与线程相同。

虚拟机栈描述的是Java方法执行的内存模型:每一个方法在执行的同时都会建立一个栈帧用于存储局部变量表、操做数栈、动态连接、方法出口等信息。

每一个方法从调用到执行的过程就是一个栈帧在虚拟机栈中入栈到出栈的过程。

局部变量存放着编译器可知的各类基本数据类型、对象引用类型。

三、本地方法栈与Java虚拟机栈相似

四、Java堆

此内存区域的惟一目的是存放对象实例。

Java堆是垃圾收集器管理的主要区域。

五、方法区

方法区与Java堆同样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的信息、常量、静态变量、即时编译器编译后的代码等数据。方法区也能够看做是Java堆的一部分。

这部分区域能够不选择垃圾回收,这区域的内存回收主要针对常量池的回收和对类型的卸载。

这部分可能会致使未彻底回收而致使内存泄漏。

六、运行时常量池

未完待续...

 

鸣谢:特别感谢做者周志明提供的技术支持!

相关文章
相关标签/搜索