java流行起来的原因无非是跨平台,垃圾回收这些,而VM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行,JVM是java的重中之重,在Java这条路上能走多远,主要取决于对JVM的理解程度。
1.内存分析
最初学习java的时候接触内存的概念是从马士兵的视频当中,不过作为初学,对于它的理解也是比较简单粗暴的,下面这张图是进一步学习之后的成果。
区域分析:
引擎区:引擎执行加载等过程需要内存
方法区:存放类信息、常量、静态变量,即类对象,也称为永久代/permgen space/non-heap
栈区:包含本地方法栈和java方法栈,是执行代码所占的内存,heap
堆区:堆存放的是对象,包含新生代和老年代,其中新生代又分为eden、s1、s2
2.线程栈与栈帧的执行
如果一个 web请求到达,处理一次为controller.a调用service.b调用dao.c,它是首先启动一个新线程,及线程栈,再将a/b/c 为栈帧亚茹到线程栈中,最后执行c/b/a返回reponse.
3.垃圾回收算法
(1)标记-清除算法(Mark-Sweep)
下面这两张图分别表示了回收前和回收后的状况,白色的表示未被占用,绿色的表示正在使用,蓝色的表示即将回收,标记回收就是先把即将回收的标记,然后把标记的内存回收。就像我们平时收拾桌子,直接把废物去除。
(2)复制算法(Copying)
颜色表示与上图表示是一样的,将内存分为两等份s1和s2,将s1中存活对象全部复制到s2,然后清空s1。就像有一篮子苹果有好有坏,现在我重新拿了另一个篮子,把好的苹果挑到这个篮子里面,然后把原来篮子里面的倒掉。
(3)标记-整理算法(Mark-Compact)
针对的是老年代的回收,首先将正在使用的对象标记,然后往一端移动,最后清除边界以外的内存。像整理书架,抽调中间的书之后把剩下的书往里推使挨着放好。
写在后面:
对于垃圾回收,可以通过引用计数法和可达性分析法来判断哪些是需要回收的对象,垃圾回收的过程目前还不能很系统理解,这一块还需要一个反复的学习和理解,等这个月研究生备考结束就该好好的学习研究一下了。