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

相关推荐

04-02 17:22
新疆大学 Java
1. 你在这个物流平台项目中扮演的角色是什么?主要负责后端的哪一部分?2. 能简单介绍一下你负责的核心模块(货单大厅)的业务流程吗?3. 货单大厅里高频使用的多条件组合查询,你后端的存储用的是什么?4. 这个查询对应的数据量有多大?5. 除了 MySQL,你有考虑过用别的存储引擎做这种多条件检索吗?有没有必要?如果要换,应该用什么来做?6. 简历上写了 SQL 优化,整个问题是怎么发现,然后怎么解决的?7. 什么是回表?8. 你用 EXPLAIN 发现查询慢,具体是因为没有用索引,还是索引没用对?9. 联合索引的“最左匹配原则”知道吗?具体是什么意思?10. “迷你豆包”这个项目是干什么用的?主要是出于什么考虑要做这个项目?11. 能简单介绍一下这个项目中你觉得比较感兴趣的技术点吗?12. 进程和线程的区别是什么?13. 进程的上下文切换和线程的上下文切换是怎么做的?包含了哪些步骤?14. 什么是虚拟内存?使用虚拟内存有什么好处?15. 缺页中断(Page Fault)是什么意思?16. 操作系统里面有哪些锁?(或 Java 里面有哪些锁?)17. 如果 synchronized 和 ReentrantLock(可重入锁)两个选的话,优先选哪个?为什么?18. 正常情况下(单体服务中),默认应该优先选哪个锁?19. 知道 BIO、NIO、AIO 吗?BIO 的“同步阻塞”是什么意思?20. 简单介绍一下 TCP 的三次握手和四次挥手过程。21. 为什么 TCP 建立连接需要三次握手?22. TIME_WAIT 状态出现在四次挥手的什么时候?23. TIME_WAIT 状态会持续多长时间?24. HTTP 状态码 404(找不到页面)代表什么?这是服务端的问题还是客户端的问题?25. HTTP 状态码 504 一般出现在什么情况下?26. 在浏览器里面输入一个网址,到页面最终展示出来,这中间经历了怎样的过程?27. 什么是 TCP 的粘包和拆包?28. 怎么解决粘包和拆包的问题?29. MySQL InnoDB 引擎的索引使用的是什么树结构?B+树和B树的区别是什么?30. 为什么 MySQL 采用 B+树,而不用红黑树?31. 听说过幻读吗?解释一下什么是幻读。32. 怎么解决幻读问题?33. 幻读在什么隔离级别下可以解决?34. 一般怎么解决 Redis 缓存与 MySQL 数据库的缓存一致性问题?35. JVM 的内存模型(运行时数据区)包括哪些部分?36. 字符串(String)和数字在 JVM 中分别存放在哪里?37. 垃圾回收(GC)算法有哪些?38. CMS 和 G1 垃圾回收器的区别是什么?它们分别应对什么场景?39. 为什么到了 JDK 1.8 之后开始主流推荐使用 G1?CMS 有什么缺点?40. 相比之下,CMS 和 G1 谁的 GC 停顿时间会更长?为什么?41. HashMap 和 ConcurrentHashMap 的区别是什么?42. ConcurrentHashMap 是怎么做到线程安全的?43. 简单介绍一下 Spring 的控制反转(IOC)和面向切面编程(AOP)。44. AOP 的核心底层是使用什么机制实现的?45. 我们平时写个注解就能生效,注解的基本原理是什么?它为什么能把逻辑织入到代码运行路径中?46. 你平时是怎么使用 AI 辅助开发的?你的项目代码是直接用 AI 写的吗?47. RAG(检索增强生成)的一个完整运行流程是怎样的?48. 为什么要做 RAG 这个东西?它解决了什么问题?49. Token 和上下文窗口(Context Window)的概念分别是什么意思?50. 为什么要控制 Token 的数量?51. 大模型的“幻觉”是什么意思?是怎么产生的?
面试问题记录
点赞 评论 收藏
分享
评论
点赞
45
分享

创作者周榜

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