《深入理解Java虚拟机》学习笔记(一)

  JDK是支持Java程序开发的最小环境集,JRE是支持Java程序运行的标准环境,JRE是JDK的一部分。

  Java 1.0版本诞生于1995年,其使用的虚拟机是Sun Classisc VM,这款虚拟机已经不再使用。JDK1.3时,HotSpot VM成为了默认的虚拟机。其他较为出名的Java虚拟机还包括JRockit、J9等。

  JDK1.5中的java.util.concurrent包实现了一个粗粒度的并发框架,JDK1.7中的java.util.concurrent.forkjoin包则是对该框架的一次重要扩充。Fork/Join是处理并行的一个经典的方法,能够轻松地利用多个CPU,利用Fork/Join模式,我们可以顺利地过渡到多核时代。

  

  Java 8中,将会提供对lamda的支持,函数式编程将会得到很好地支持,而函数式编程的一个重要特点就是适合并行运算。

  由于指针膨胀和各种数据类型对齐补白等原因,64位的Java虚拟机的效率要比32位的Java虚拟机效率低。企业级J2EE经常需要4GB以上的内存,目前很多仍采用虚拟集群方式在32位虚拟机中运行,迫切需要64位虚拟机的支持。

  Java虚拟机在运行Java程序时会将它所管理的内存划分为若干不同的区域。这些区域有着各自的用途,以及创建和销毁时间。根据《Java虚拟机规范(Java SE7版)》的规定,Java虚拟机将会把它所管理的内存划分为下面的几个区域:

  

  

  我们可以看到运行时数据区中的方法区和堆是由所有的线程所共享的,其余的如虚拟机栈、本地方法栈、程序计数器都是线程间隔离的。

  程序计数器,可以看做当前线程所执行的字节码的行号指示器。字节码解释器通过程序计数器中的值来选取下一条下一条需要执行的字节码指令。循环、跳转、异常都需要依赖于程序计数器来完成。

  执行多线程的程序时,为了确保线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器。

  此区域是唯一一个在Java虚拟机规范中没有规定OutOfMemoryError的区域。

  Java虚拟机栈,Java虚拟机栈是线程私有的,它的生命周期和线程相同。Java虚拟机栈包含的信息包括:局部变量、操作数栈、动态链接、方法出口等。

  Java虚拟机中针对这块内存定义了2种异常,如果线程请求的栈深度大于虚拟机所允许的深度,将会抛出StackOverflowError异常,如果虚拟机栈无法申请到足够的内存,就会抛出OutOfMemoryError异常。

  本地方法栈,本地方法栈和Java虚拟机栈的作用很相似,只是本地方法栈是为Java虚拟机的Native方法服务的。很多的虚拟机(例如HotSpot)就直接将本地方法栈和Java虚拟机栈合二为一。

  Java堆,Java堆的目的是存放对象实例。Java堆是垃圾回收管理器管理的主要区域,Java堆可以分为新生代和老生代,再具体一点可以分为Eden空间、From Survivor、To Survivor等。

  Java堆可以是物理上不连续的空间,只要是逻辑上连续即可。

  主流Java虚拟机中的Java堆都是可变的,通过-Xmx和-Xms来控制。

  Java堆上无法申请内存时也会抛出OutOfMemoryError异常。

  方法区和Java堆一样,也是线程间共享的内存区域。方法区主要用于存储类信息、常量、静态变量等数据。

  对应HotSpot虚拟机而言,方法区可以被看做是永生代。但并非数据进入了方法区就不会被回收,方法区的回收主要是常量池的回收和类型的卸载。

  static是静态变量,在每次赋值的时候保留最后一个值·是属于类变量,通过类或者对象可以修改,而final是属于常量,赋值一次,不可以再次重新赋值。

  

时间: 2024-10-21 10:37:08

《深入理解Java虚拟机》学习笔记(一)的相关文章

原型模式和Effective C++学习笔记

原型模式(Prototype):用原型实例制定创建对象的种类,并且听过拷贝这些原型创建新的对象. 浅复制:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其副本引用同一对象. 深复制:把引用变量的对象指向复制过的新对象,而不是原有的被引用的对象. Effective C++: 1:在资源管理类中提供对原始资源的访问. (1),APIs 往往要求访问原始资源(raw resources),所以每一个 RAII class 应该提供一个"

模板方法模式和Effective C++学习笔记

模板方法模式: 定义:定义一个操作中的算法的骨架,而将一些步骤延伸到子类中.模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤. (1),用了继承,并且肯定这个继承有意义的情况下,就应该要成为子类的模板,所以重复的代码都应该提升到父类中,而不是让每个子类去重复. (2),当我们要完成某一个细节层次一致的过程或者一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑模板方法模式来处理. (3),模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优

Effective C++学习笔记(Part Seven:Item 41-48)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第7部分:模板与泛型编程 所谓泛型编程就是以独立于任何特定类型的方式编写代码.使用泛型程序时,我们需要提供具体程序实例所操作的类型或值.模板是泛型编程思想的一种实现,也是C++研发者思想精髓所在. 条款41:了解隐式接口和编译器多态 条款42:了解typename的双重含义 条款4

Effective C++学习笔记(Part Six:Item 32-40)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第6部分:继承与面向对象设计 面向对象语言有三大特性:继承,封装和多态.遥想当年,每次校招笔试的时候都会有的,但能够甚至这六个字内涵的人,不再多数.本部分概括的说,深入的讲解三大特性之一----继承性.本部分花的时间不少,也感觉挺有意思的.特别是针对某个条款编写个具体程序实现后,明

Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法

避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不可达时(即没有引用指向这个对象时),会由垃圾回收器来回收与该对象相关联的内存资源:而其他的内存资源,则一般由try-finally代码块来完成类似的工作. 一.finalizer的缺点: 1. 终结方法的缺点在于不能保证会被及时地执行. 及时执行finalizer方法是JVM垃圾回收方法的一个主要功

Effective C++学习笔记(Part Two:Item 5-12)

?? 近期最终把effectvie C++细致的阅读了一边,非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此.必备查找使用,假设总结有什么不当之处,欢迎批评指正: 如今仅仅列出框架.近期会尽快填充完整: 第2部分:构造/析构/赋值运算 个人觉得这是C++的比較难理解的地方,也是C++的深邃所在,刚開始阅读时,可能在某些地方不理解,最好的方式是边读边编程实现,用心去思考其精髓所在! 条款5:了解C++默默编写并调用那些函数 条款6:若不想使用编译器自己主动生成的函数,就该明白拒绝

Effective C++学习笔记之对RAII思想的思考

 在阅读  Effective C++时,对RAII开始不理解,现总结如下: RAII是Resource acquisition is initialization的缩写形式,即"资源获取就是初始化",是C++等编程语言常用的管理资源.避免内存泄露的方法.它保证在任何情况下,使用对象时先构造对象,最后析构对象. 根据RAII 对资源的所有权可分为常性类型和变性类型,代表者分别是boost::shared_ptr和std::auto_ptr:从所管资源的初始化位置上可分为外部初始化类

Effective C++学习笔记(Part Three:Item 13-17)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第3部分:资源管理(Resource Management) 个人认为这是C++的比较关键的地方,利用好,可以使项目节约资源,合理利用内存资源,防止内存泄露.对于"资源"这两个字,可能刚接触,比较抽象,但你结合一下实际,也有很具体了! 条款13:以对象管理资源 条款14:

Effective C++学习笔记(Part Four:Item 18-25)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不 当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第4部分:设计与申明(Designs and Declarations) 本部分主要讲述了类的设计原则以及设计规则,以及成员命令.成员函数设计时,应该注意的一些地方:个人感觉这是设计好一个类必不可少的. 条款18:让接口容易本正确使用,不易被误用 条款19:设计class犹如设计

Effective C++学习笔记(Part Five:Item 26-31)

 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查找使用,如果总结有什么不 当之处,欢迎批评指正: 现在只列出框架,最近会尽快填充完整: 第5部分:实现(Implementations) 本部分主要讲述了类实现过程中的一些原则,为设计出高效率的实现方式,这是你的必经之路:在这一部分读的比较仔细,因为本人在类型转换这方面吃了不少苦头. 条款26:尽可能延后变量定义式的出现时间 条款27:尽量少做转型动作 条款28:避