不懂JVM,怎么当架构师,一文带你了解JVM
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值) 非堆式内存 有些对象并不会创建在堆中,这些对象在逻辑上被认为是JVM机制的一部分。 非堆式的内存包括: 永久代中包含: 方法区 内部字符串 代码缓存:用于编译以及存储方法,这些方法已经被JIT编译成本地代码 内存管理 对象和数组永远都不会被显式释放,因此只能依靠垃圾回收器来自动地回收它们。 通常,以如下的步骤进行: 新对象和数组被创建在年轻代 次垃圾回收器将在年轻代上执行。那些仍然存活着的对象,将被从eden区移动到survivor区 主垃圾回收器将会把对象在代与代之间进行移动,主垃圾回收器通常会导致应用程序的线程暂停。那些仍然存活着的对象将被从年轻代移动到老年代 永久代会在每次老年代被回收的时候同时进行,它们在两者中其一满了之后都会被回收 JIT编译 JIT具体的做法是这样的:当载入一个类型时,CLR为该类型创建一个内部数据结构和相应的函数,当函数第一被调用时,JIT将该函数编译成机器语言.当再次遇到该函数时则直接从cache中执行已编译好的机器语言. 方法区 所有的线程共享相同的方法区。所以,对于方法区数据的访问以及对动态链接的处理必须是线程安全的。如果两个线程企图访问一个还没有被载入的类(该类必须只能被加载一次)的字段或者方法,直到该类被加载完成,这两个线程才能继续执行。 类的文件结构 一个被编译过的类文件包含如下的结构: ClassFile { u4magic; u2minor_version; u2major_version; u2constant_pool_count; cp_infocontant_pool[constant_pool_count – 1]; u2access_flags; u2this_class; u2super_class; u2interfaces_count; u2interfaces[interfaces_count]; u2fields_count; field_infofields[fields_count]; u2methods_count; method_infomethods[methods_count]; u2attributes_count; attribute_infoattributes[attributes_count];} 可以使用javap命令查看被编译后的java类的字节码。 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |