您的位置:首页 > 其它

深入理解JVM--我的学习笔记

2017-08-16 16:00 381 查看
        现在转行做Java开发,相信有过Java开发经验的人都知道,做Java开发要学很多东西:JavaSE,JVM,设计模式,线程并发以及锁原理等等。虽然不多,但内容很有深度,需要反复的斟酌才能有更深一步的理解。本人近来在看《深入理解JVM》,但是怕看后又忘了或是理解不到位,不够深入。所以把看过的东西用自己的语言写在这里,共勉。

        首先说一下为什么要学习JVM。JVM是Java程序运行锁必须的环境,没有它Java就不能运行。Java程序运行时与之相关的class,instance,内存都有JVM管理,所以理解了JVM的运行机制,出现BUG时可以很快的定位Bug的原因和位置;这也是通向Java架构师必须要走的一步。另外,在Java面试的过程中,不少的技术经理也都会问到关于JVM的一些东西,回答的不好基本就没戏了。所以为了工作,为了兴趣都应该学习JVM的运行机制。好了,闲话说道这里,马上进入正题。(文章会不定时更新,欢迎各位批评指正,共同进步)。

        第一节  JVM的内存管理

         JVM的内存对计算机的物理内存做了映射处理,即JVM的内存的不同部分可能对应着物理内存的运存、寄存器或告诉缓存(想了解具体映射关系的同学,可以参考相应的博文,不过意义不大)。

      JVM将内存划分为六个部分:Java堆,方法区,程序计数器区,虚拟机栈(VM Stack),本地方法栈(native stack),直接内存区(direct memory)。下面具体介绍各个部分。

      (1)Java堆。这个区域应该是每一个Java程序员都知道的地方,你创建的每一个对象都存放在这个区域。GC的大部分操作都是在这里,毕竟GC的主要工作就是释放无用的对象实例。这个区域是线程共享的。

       (2)方法区。这个区域也是线程共享的(就这俩是想成共享的)。进一步可以分为常量池、静态区、jit编译器编译过的代码等等。常量池又分为Class常量池和字符串常量池,其中字符串常量池是可以动态扩展的(运行时产生的字符串常量也添加到这里);Class常量池里存放着程序中每一个用到的类的Class文件(这个会在后边的对象布局中用到);静态区存放的是静态成员包括静态域和静态方法;

       (3)程序计数器区。该区域是线程私有的(VM stack,native stack也是线程私有的),它可以看做的字节码在运行时的指示器。因为操作系统的时间片运行原理,每个线程在自己的时间片用完后都要挂起,以便其他线程或进程能运行,所以要对线程进行现场保护,该区域也就需要线程私有了。

       (4)虚拟机栈。这个区域是为Java方法服务的。方法在执行时所需要的参数类型,返回类型等都在这里,其中最重要的是变量符号表,这个符号表中存放了方法的基本类型,引用类型和returnValue类型,其大小在编译时期就已确定,运行时大小不变。

       (5)本地方法栈。这个区域和虚拟机栈类似,只不过这
4000
个栈时为本地方法服务的。但不同的虚拟机又不同的实现,sun公司的Hotspot将这两个栈合二为一了。

       (6)直接内存区。这个区不是JVM内存的一部分,也不是JVM规范的一部分,其大小不受Java堆大小的影响,理论上可以任意大小,但是计算机的物理内存和交换区大小有限,所以还是受物理机的限制。这部分也是经常被访问的地方,也是在考虑JVM内存大小时容易忽略的地方。应注意 !

       简单总结:线程共享的区域----Java堆和方法区;线程私有的区域----程序计数器区,虚拟机栈,本地方法栈;

       GC经常访问的是Java堆,堆方法区的访问效果也不错,主要是涉及到类的卸载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: