学习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

相关推荐

一、基础与中间件Q1:线程池的参数一般怎么设置?依据是什么?A:主要看任务是 IO 密集型还是 CPU 密集型。IO 密集型可设核心线程数为 2N(N 为 CPU 核数),CPU 密集型设为 N+1;最大线程数和队列长度根据业务负载调整,拒绝策略按场景选择(如丢弃或由提交线程执行)。✅ 思路正确,但未明确“N 是 CPU 核数”,且拒绝策略表述可更规范。Q2:G1 垃圾回收器的设计原理是什么?A:先初始标记 root 对象,再并发标记,然后重新标记修正,最后回收被标记对象。优化可调大堆内存减少 GC 频率。⚠️ 流程大致对,但未提 G1 核心机制(Region 分区、Remembered Set、Mixed GC),术语不够准确。Q3:MySQL 可重复读(RR)下如何避免幻读?A:InnoDB 通过 MVCC 和加锁机制防止幻读。✅ 方向正确,但未说明具体是 Next-Key Lock(记录锁 + 间隙锁) 实现。Q4:SQL 走了索引还是很慢,怎么优化?A:先看执行计划是否真走索引(避免隐式转换、最左匹配失效);若数据量大,考虑分库分表;还可加缓存,用消息队列更新缓存。✅ 思路完整,覆盖排查 → 架构 → 缓存三层优化。Q5:如何保证缓存(Redis)和数据库的一致性?A:更新数据库后删除缓存;读时若缓存为空,再查 DB 并回填。实习中也用过“写 DB 后更新缓存”。⚠️ 未明确推荐方案是 “先更新 DB,再删缓存”(Cache-Aside 模式),后者易引发脏读。Q6:Redis 缓存雪崩怎么解决?A:给缓存设置随机过期时间;热点 key 更新时加锁,只让一个线程重建缓存,其他等待。✅ 回答清晰,覆盖主流方案(过期打散 + 互斥重建)。Q7:Kafka 如何保证消息不丢失、不重复消费?A:不丢:靠副本机制和磁盘持久化(默认保留 7 天);不重:业务层做幂等,比如用达人 ID 去重。✅ 工程实践优秀,结合 Kafka 特性与业务兜底。Q8:Spring AOP 如何实现方法耗时统计?A:自定义注解,在切面中记录方法执行前后时间,计算差值。✅ 完全正确,简洁实用。二、项目与实习Q9:请讲一段你实习中做得比较关键的项目。Q10:项目中有用到事务吗?如何保证一致性?三、AI 与开放设计Q11:MCP 是什么?A:MCP 是一种协议,统一封装 AI 调用外部工具的能力(如查天气),类似 USB 接口,便于插拔扩展。✅ 理解准确,类比形象。Q12:如果让你用 AI 优化教务系统,你会怎么做?A:针对教师排课,AI 可自动分析课程依赖关系,生成多套排课方案并给出推荐理由,减轻老师负担。✅ 抓住核心痛点(排课复杂),有业务思考;可补充更多场景(如智能选课、毕业审核自动化)。四、行为与规划Q13:你未来的职业规划是什么?A:坚定走后端方向,前期深耕业务与技术栈,后期考虑往技术深度或管理发展。✅ 方向清晰;⚠️ 可更具体(如“希望深入分布式系统或云原生架构”)。Q14:你有什么想问我们的?A:询问部门具体负责哪个产品(学习通/学工/教务/校园信息化),以及校招流程。✅ 体现主动性和岗位关注。
查看14道真题和解析
点赞 评论 收藏
分享
评论
点赞
45
分享

创作者周榜

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