学习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
楼主写的非常好,受教了。
点赞 回复 分享
发布于 2017-04-10 23:14
很清楚
点赞 回复 分享
发布于 2016-03-11 14:24
写的不错
点赞 回复 分享
发布于 2016-03-06 22:57
好牛啊
点赞 回复 分享
发布于 2016-03-05 16:11
期待楼主更贴
点赞 回复 分享
发布于 2016-03-05 15:54

相关推荐

xdm 早上喝奶茶差点喷出来。事情是这样的,我们班有个哥们儿,简称 L,去年秋招拿了字节sp,专业方向是后端。我们当时都震惊:这哥们儿平时课上从来不发言,期末小组作业基本是划水的那种,刷题平台 commit记录我点进去看过,绿格子稀稀拉拉。但他面试一路绿灯。一面二面三面 hr 面,全过,给的还是sp。当时班级群里恭喜他的、问他经验的、约饭的,热闹了一周。他说自己"运气好,准备充分"。我们都信了,直到三月初他入职。入职第二周开始,班里另一个进字节的同学W(在隔壁组的)开始跟我他的不对劲。一开始是写代码慢,后来写不出来,再后来是组里 mentor 让他fix 一个简单 bug 都搞了一下午没动静。最离谱的是上周。W 说他们大部门搞了个新人分享会,让新人讲一下自己负责模块的设计思路。L 上去讲了 20分钟,全程念稿子,问答环节别人随便问一个"那你这里为什么用 Redis 不用 Memcached",他直接卡 30秒说"这个我回去再确认一下"。会后他 mentor 直接找 leader 谈,leader 找 hr 谈,hr调出了他面试录像,全程对比口型和回答节奏,发现他二三面有大量时长在偷偷看屏幕外(推测开了双机位 AI 答题)。(这段是 W后来转述给我的,他自己也是听他组里同事八卦来的)昨天下班前,W 告诉我L 被辞退了,让他自己走,不走就走仲裁但会发函到学校。L 现在已经回学校了,朋友圈仅三天可见。我说真的,我不是个心眼小的人,但是我看到这个消息的时候真的有种"嗯,挺好"的感觉。去年秋招我投字节后端,简历挂。我准备了八个月,背 八股 + 刷 500 题 +项目改了三版,连面试机会都没拿到。班里这哥们儿凭着一个外挂上岸,最后还是被甩出来了。不是说作弊就一定会被发现,但是当面试拿到的 offer远远超出真实能力的时候,迟早会有这一天。试用期三个月不是给你过家家的,是真的要写代码、要在会议上回答问题、要扛需求的。我现在反而有点同情他。同情他相信"上岸就是终点"。发出来不是为了嘲笑谁,就是想说给那些正在被身边作弊上岸的同学搞得很 emo 的 uu 们听——别急,回旋镖很长,但它一定会回来。你继续刷你的题,写你的项目,背你的八股。该是你的迟早是你的,不是你的早晚还得还回去。xdm 共勉。
牛客12588360...:我不想评论面试方式,作弊是绝对不对的,但是你八股加刷题也不过是个做题小子,他穿帮纯粹是他菜,你也没有高明到哪里去
点赞 评论 收藏
分享
评论
点赞
45
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务