黑马程序员技术交流社区
标题:
我的学习感悟
[打印本页]
作者:
宇智波越
时间:
2017-9-26 17:27
标题:
我的学习感悟
本帖最后由 小石姐姐 于 2017-9-28 15:02 编辑
我的学习感悟
和大家分享一下自
己的感
受,java是拥有面向对象特性的一门语言,承载着JVM,奠基着丰富的框架。既然是语言,那么基本的语法自然而然是要掌握,《Thinking in java》一本书,就够了,笔者看了4遍,每次看还是受益匪浅。其次,是面向对象特性,这一点光看书是看不懂的,一定要配合实际项目看,阅读源码,建议看看设计模式,有助于理解。接下来最重要的一点,JVM,java的核心所在,许多学者不关心jvm的知识,这也成为学习java的一道瓶颈,Java的内存分配,垃圾回收,线程究竟是怎么实现?当你了解了这些,会在遇到问题时候有更加深入的思考,而不是表面的排除异常等等。推荐一本书——《深入了解java虚拟机》,赞!最后,框架的学习是建立在上述基础上,如果单纯的学习一个框架,那么结果就是只会用,换一个或者添加一个功能就手足无措了,语言只是工具,学会融会贯通才是程序员应有的能力,具体需要在实践中会接触到,所以当你觉得达到一定瓶颈的时候,就反过来看看上述三点比较好——
个人经验。
{:8_474:}
JVM运行时数据区方法区在字面意思上, “方法区”这个词会让人产生误解。因为方法区存放的不只是方法, 它存放的是类型信息。我们在写程序的时候, 几乎总是在和类, 对象打交道, 我们知道根据一个类可以创建对象。 一般来说, 我们操纵的是对象, 访问对象的属性, 调用对象的方法等, 但是我们要思考这样一个问题, 虚拟机根据什么信息知道如何创建对象的呢? 当然是根据这个对象的类型信息, 但是这个类型信息在哪里呢?现在我们知道是在方法区中。 那么类型信息是被谁加载到方法区中的呢?由上面的体系结构图, 我们可以知道是类加载器子系统?那么所谓的类型信息, 都包含什么信息呢?这些信息又是如何存放的呢?这里的类型信息, 可以笼统的认为就是我们前面讲解过的一个class文件,类加载器子系统将会提取class文件里面的类型信息,并将这些类型信息存放到方法区中。 至于方法区中如何存放一个类型数据, 是和JVM的具体实现相关的。 但是不管如何实现, 一个类的类型信息总是会包含如下信息:
类的全限定名
当前类的直接父类的全限定名
这个类是接口类型, 类类型, 还是枚举类型
类的访问修饰符信息
当前类型的超接口的全限定名
当前类型的常量池
字段信息
方法信息
堆方法区是存放类型数据的, 而堆则是存放运行时产生的对象的。 和C++不同的是, Java只能在堆中存放对象, 而不能在栈上分配对象, 所有运行时产生的对象全部都存放于堆中, 包括数组。 我们知道, 在Java中, 数组也是对象。一个JVM实例中只有一个堆, 所有线程共享堆中的数据(对象) 。
Java虚拟机支持几种不同的创建对象的指令, 如new , anewarray等。 这些指令执行的结果就是在堆中分配内存, 并创建对象。 但是Java虚拟机的指令集中并不包含任何释放内存的指令, 因而我们也就不能手动释放内存。 所有被创建的对象都会被一个叫做垃圾收集器(GC)的模块自动回收, 垃圾收集器有不同的实现方式, 他们以 特定的方式判断对象是否过期, 并以特定的方式对对象进行回收, 关于垃圾收集的话题不是本文的重点, 这里就不多说了。 我们只要知道:所有创建的对象都存在堆中, 而垃圾收集器会自动回收过期的对象, 所以,JVM的堆区是垃圾收集器的“重点管理区”。
Java栈Java栈是一个线程的执行区域, 它保存着一个线程中的方法的调用状态, 也可以说, 一个Java线程的运行状态, 都由一个Java栈来保存。 在这个栈中, 每一方法对应一个栈帧, 请注意区分栈帧和栈这两个概念。 栈指的是整个线程的执行栈, 栈帧是栈中的一个单位, 每个方法对应一个栈帧。 JVM会对Java栈执行两种操作: 压栈和出栈。 这两种操作在执行时都是以帧(栈帧)为单位的。 当调用了一个新的方法, 就会压入一个栈帧, 当一个方法调用完成, 就会弹出这个方法的栈帧, 回到调用者的栈帧。
小小分享,欢迎各位大牛讨论...
作者:
不绝如缕
时间:
2017-9-27 15:43
总结的很到位,看到了很多自己遗忘的东西,更加通透的理解了自己处于模糊状态的知识点,希望楼主继续更新~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2