您的位置:首页 > 编程语言 > Java开发

JVM虚拟机与内存模型

2018-02-12 22:08 323 查看

JVM虚拟机与内存模型

JVM虚拟机与内存模型
概述

悬挂指针

JVM虚拟机和内存模型

垃圾回收

总结

概述

大约7年前,偶然的机会听了中科院薛景轩老师的《C++的基本概念及原理》课程,课如其名,对C++许多概念都进行了充分的说明,这是同时代的所有其它可能无法做到的,我对其中的内存模型部分印象深刻,薛老对内存模型的理解及其证明步骤深入我心,并且在本科阶段跟着一位很牛的老师(王老汉)做了较多的实践,其中它是最具代表性的工作,可以说对内存模型及其其它C++概念的深入理解,对于我调试程序等任务都有积极的促进作用,在我本科毕业时王老汉跟我说,学学Java,这会让你有不一样的体验。带着这句话和这份期待,我进入了硕士阶段的学习,大部分同学在这个阶段可能会放弃写大量的代码,但是我恰恰相反,我的硕导对代码能力的要求极高,也正是这份严格的要求,使得我在准备读博士申请博士期间,获得了很多老师的认可,不管是科研能力还是工程实现能力。硕士阶段,全部是用Java编码,包括我的毕设项目等等。在使用Java过程中,我对JVM有一些自己的感悟,或许这种感悟带着曾经C++程序员的观点。开篇,我先说明JVM的实现巧妙但不并唐突,在其设计原理中,我们能够看到一些在计算机基础课程(如操作系统、计算机原理)中折中设计的影子。JVM的美值得我们说说。如果你曾经是一名C++程序员,那么你可能会从这篇文章开始觉得Java的设计并不那么陌生。>,可以说对内存模型及其其它C++概念的深入理解,对于我调试程序等任务都有积极的促进作用,在我本科毕业时王老汉跟我说,学学Java,这会让你有不一样的体验。带着这句话和这份期待,我进入了硕士阶段的学习,大部分同学在这个阶段可能会放弃写大量的代码,但是我恰恰相反,我的硕导对代码能力的要求极高,也正是这份严格的要求,使得我在准备读博士申请期间,获得了很多老师的认可,不管是科研能力还是工程实现能力。硕士阶段,全部是用Java编码,包括我的毕设项目等等。在使用Java过程中,我对JVM有一些自己的感悟,或许这种感悟带着曾经C++程序员的观点。开篇,我先说明JVM的实现巧妙但不并唐突,在其设计原理中,我们能够看到一些在计算机基础课程(如操作系统、计算机原理)中折中设计的影子。JVM的美值得我们说说。如果你曾经是一名C++程序员,那么你可能会从这篇文章开始觉得Java的设计并不那么陌生。

悬挂指针

C++程序员都知道,悬挂指针的概念,为了解决悬挂指针,在C++中引入了引用数据类型,引用类型用一句话概括:别名其表,指针其实。在大部分的C++教材中,把引用定义为一个变量的别名,这源于大家对以谭浩强为代表的中文教材的推崇,这种理解不应该是一名合格的程序员应该有的理解。引用类型其实是C++为了避免程序员在使用过程中对指针的滥用而设计的类型,当然在后来C++11等标准中加强了对引用数据类型的介绍,但是我想大部分老的C++程序员还在引以为豪的使用指针,而对C++中出现了引用数据类型视而不见。有人会说你不是在说Java,怎么一直在说C++呢?我想说的是,Java中的引用数据类型,不是凭空而来的,它正是对C++中引用类型的完美应用,这种应用最根本在于自动垃圾回收机制的出现。

JVM虚拟机和内存模型

我们都知道,Java一直在说”Write one, Run anywhere”,即一次开发,处处运行。实质上JVM(Java Virtual Machine)是SUN公司模拟的一个”机器”,这个机器像一个真实的机器一样,有自己的指令集,有自己的程序计数器(但是没有寄存器,因为这个机器是软件模拟的,寄存器并不能像真实机器上的寄存器那样提高速度,因此这种设计没必要),有自己的堆区,有自己的栈区,有自己的全局代码区和数据区,这种设计像是在C++中存在的虚拟内存概念。在C++中,开辟出虚拟内存后,程序运行在虚拟内存之上,并且由操作系统负责管理。但是在Java中交给JVM管理。这种设计存在诸多优点,在此不再赘述。

典型的JVM结构如下,我们能够看到JVM分为三个部分,分别是类加载器部分,内存部分和执行引擎部分。程序开发完成之后,只要在装有JRE的机器上都能够运行。如果你曾经对C++的内存模型有比较充分的理解,那么你可以看到,JVM的内存模型和C++的完全一样,其中需要特别说明的是,在Java中,堆属于进程级别,栈属于线程级别。new之后生成的对象,也全部是在堆区生成,这和C++也完全一样,只不过,在C++中,指针的释放需要程序员自己处理,但是在Java中这归垃圾回收期管。



该篇文章简单直接的说明了本节内容,你可类比C++中该部分说明

垃圾回收

由于在Java中大量的使用引用数据类型,我们说引用类型的本质是指针,因此,为了避免造成悬挂指针而浪费内存,对这些垃圾的回收也是另外一个需要重视的问题,在Java中引用了垃圾回收机制,垃圾回收方法类型与操作系统中的内存碎片整理方法,在文章中进行了简单的讲解,足够理解。关于参数调优的问题,需要在实践中总结。

总结

本文从一个C++程序员的角度,分析了JVM设计的合理性与巧妙性,如果你对本文说的观点有更多的问题,请通过微信等联系方式联系我,我们可以进行更加深入的探讨。今天是特殊的一天,2年前的今天,写了第一篇文章,去年一年,几乎没有写文章,今晚的文章是一个新的起点,我希望能写一些算法的文章,能写一些更加有趣的文章,某个具体的实现技术,不会再写,这种流水账没太多的意义。最后推荐一波我的github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息