`
chenjili88
  • 浏览: 3618 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JVM垃圾回收与内存分配浅析(一)

 
阅读更多

——读《深入理解Java虚拟机JVM高级特性与最佳实践》自我整理

熟悉Java的人都知道Java的一个特点:一次编译,到处运行。但是为什么只能Java实现这个特性,而比Java执行效率更高的c、c++没有这个特性呢?首先到处运行指的是不同的操作系统 windows linux unix 等等,c/c++在不同的系统下或者不同的编译器下,其编译的规则是有些不同的,这样做是为了更大限度地提升它的执行效率,所以不得不在兼容性方面做了妥协,而Java不一样,它在不同的操作系统上面又封装了一个相当于是自己的操作系统,这就是Java虚拟机(JVM),只要每个操作系统上装上这个JVM就都可以运行基于这之上的Java程序了。

说起Java与c的不同,可能大家第一反应是Java是个面向对象的语言,第二反应就是Java拥有自动内存管理机制。那么Java的内存管理机制到底是怎样的?首先从字面上看自动内存管理,肯定管理的是内存的从分配、使用、回收、再使用的一个整个的闭环流。

在了解内存管理之前,我们首先要对JVM运行时的数据区的结构有所了解,看下图:


线程共享区代表着里面的数据区随着线程的生命周期从生到死,非线程共享区是在JVM启动时创建,关闭时销毁的。

程序计数器:它表示的当前线程执行的字节码的行号,因为在多线程环境中,操作系统对多线程采用的是轮流切换并且分配处理时间的机制,为了要保证每个线程在切换至其它线程时其执行进度不丢失,所以每个线程中都会有这么一个计数器。

虚拟机栈:它描述的是Java方法执行的内存模型,每次执行方法时会产生一个栈帧,包含局部变量栈、操作数栈、方法出口等,方法的执行从开始到结束就是这个栈帧入栈出栈的过程。

本地方法区:和虚拟机栈类似,不过它处理的是 Native方法的内存模型。

堆:内存回收中的主要回收区域,也是JVM管理的内存中的最大一块,里面存放的都是对象的实例。

方法区:这里面储存的都是一些类的相关信息、静态变量、常量、编译过后的代码等,主要是对堆的一个描述逻辑的区域。

这几个区域的联系就像下图一样:


例如在一个方法中有一个对象:Object obj=new Object(); 那么在这个方法中的Object obj 指向了一个堆中的实例obj(通过new Object()在堆中创建),同时在堆中的这块内存中还储存了一个指向方法区中这个对象相关信息的一个指针。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics