学习java的体会

    学习这么久以来,我最喜欢java的自动内存管理,恐怕最最不喜欢的就是java的泛型了,虽然泛型在很大程度上解决了容器从基本类型到包装对象的问题,但对泛型的其他用法感觉特别没意思,而且还特别的繁琐。下面还是具体谈谈我最喜欢的java内存管理,java是如何实现自动内存管理的呢?
    首先,要弄清楚java内存自动管理,必须要明白java在运行时其的内存分布情况。大致可分为5个部分:方法区、虚拟机栈、本地方法栈,java堆和程序计数器。下面详细的说下各个内存区域的作用:
    1)程序计数器;线程私有的,占用很小一部分内存,其主要作用是记录线程切换时的字节码,便于线程切换后能够回到原来的线程上去。
    2)虚拟机栈:线程私有的,java方法执行的内存模型。每个java方法执行时都会创建一个栈帧,栈帧的主要内容有局部变量表,操作数和ReturnAddress等。而且我们通常所说的栈指的就是虚拟机栈或局部变量表。局部变量表主要内容有各种基本数据类型,对象的引用类型,同时局部变量表大小在编译期已经确定而在运行期是不可变的。
    3)本地方法栈:本地方法执行所需要的栈帧。具体情况同java方法执行相似。
    4)java堆:几乎所有的java对象都是在此内存区域创建的,同时也是垃圾回收的主要区域,常称为GC堆;必须注意堆是线程共享的
    5)方法区:存储已被虚拟机加载的类信息,静态块和常量;其也是线程共享的;同时还必须注意方法区内有块内存称为常量池的。
       常量池:存储编译器生成的符号引用。
    其次,还需要明白java是如何创建对象的?我们知道java一般创建对象都是通过关键字new来的。下面来看看当我用new一个对象时,会发生什么呢?new---->在方法区找类的符号引用,看类是否已经加载,如果没有就加载类---->如果已经加载,在堆上创建对象(为对象分配内存,初始化对象,设置对象头);
    最后,你会不会疑惑java是如何在内存中查找到对象的呢,也就是java对象在内存中如何分布的呢?而且在学习java的时候,我们常被告知引用和对象的区别,而且在《java编程思想》中还把引用比喻为遥控器,这个比喻太恰当了。上面虚拟机栈中我们可以知道,对象的引用类型是存储在局部变量表中,而对象创建的是在堆中,你看引用像不像一个遥控器,指挥着在堆中对象的数据。java对象可以分为三部分:对象头、实例数据和对齐填充。其中对象头是最重要的,其包含自己特有标记:hashcode,年龄和线程锁;另外对象头必须还有指向实例数据的指针。然后java是如何查找对象的呢?其中有两种方式。一、句柄方式:也即为对象再增加个访问指针;有了句柄后,我们寻找对象是这样的:先通过局部变量变的引用找到对象的句柄,然后再通过句柄找到对象。好处是对象数据可以方便移动;缺点增加寻址的时间。二、直接方式:通过局部变量表的引用直接找到对象;好处是可以快速找到对象;缺点对象移动不方便。
    上文都是java自动内存管理的基础。如果不明白对象在内存中分布情况,对象如何创建的,那你怎么会明白下面java的垃圾回收机制呢?垃圾回收机制可以用3个词来概括:where,when和how?请看下篇详解!


全部评论
不错,期待下一篇。(建议:建议楼主字再大一些就好了嘿嘿)
点赞 回复 分享
发布于 2016-03-08 14:16
期待楼主更贴
点赞 回复 分享
发布于 2016-03-05 15:54
好牛啊
点赞 回复 分享
发布于 2016-03-05 16:11
写的不错
点赞 回复 分享
发布于 2016-03-06 22:57
很清楚
点赞 回复 分享
发布于 2016-03-11 14:24
楼主写的非常好,受教了。
点赞 回复 分享
发布于 2017-04-10 23:14

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
评论
点赞
44
分享
牛客网
牛客企业服务