JVM的启动流程
JVM的基本结构,
每一个线程有一个pc寄存器。pc寄存器总是记录下一跳指令的地址。执行本地方法是pc的值为undefined。
方法区里存放的是哪些内容? 通常和 perm永久区关联
方法区里存的都是类型信息,也就是类的信息,而类的信息又包括以下内容:
类的全限定名(类的全路径名)
类的直接超类的全限定名(如果这个类是Object,则它没有超类)
这个类是类型(类)还是接口
类的访问修饰符,如public、abstract、final等
所有的直接接口全限定名的有序列表(假如它实现了多个接口)
常量池
字段、方法信息、类变量信息(静态变量) 装载该类的装载器的引用(classLoader)、类型引用(class)
方法区是系统分配的一个内存逻辑区域,是用来存储类型信息的(类型信息可理解为类的描述信息)。方法区主要有以下几个特点:
一.方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只允许一个线程去装载它,而其它线程必须等待
二.方法区的大小不必是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。
三.方法区也可被垃圾收集,当某个类不在被使用(不可触及)时,JVM将卸载这个类,进行垃圾收集
java堆,可参考http://uule.iteye.com/blog/1894724
栈:先进后出
栈里面包含的内容,局部变量表和操作数栈。
JVM中类方法变量的存储方式
volatile相关内容参考http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
线程内部的指令有可能被java虚拟机重拍,例如锕a=1;b=1;编译成java指令后,jvm判断前后两个语句没有前后顺序关联的话,jvm能对指令的先后顺序进行优化。但有些时候肯定不会优化。
参考http://xtu-tja-163-com.iteye.com/blog/769992
相关推荐
* 装载:装载是指读入二进制的Java类型(class文件)到Java虚拟机中,并形成一定的数据结构(数据结构可理解为存储类中局部变量、方法等类属性的一种方式)。 * 连接:连接是指把读入的类型数据合并到虚拟机运行状态...
在JVM规范中,虽然没有规定具体的实现方式,但通常只有当类的所有实例都已被回收,且加载该类的类加载器也已被回收时,对应的类信息才会被视为可回收的。 总结来说,方法区是JVM存储类型信息的核心区域,其管理和...
这些变量存储在方法区的运行时常量池中。 4. **解析**:此时,JVM将常量池中的符号引用转换为直接引用。这个阶段不是必需的,可以在类或接口被首次使用时动态解析。 5. **初始化**:最后,JVM执行类的初始化方法...
这些变量存储在方法区。注意: - 只分配静态变量内存,实例变量在初始化阶段分配。 - 初始化默认值,如int类型的变量默认为0。 - 对final静态变量进行初步赋值。 - 解析(Resolution) 解析阶段将类文件常量池...
1. **存储空间**:类变量的存储空间是在方法区(或称为永久代,根据JVM版本的不同可能有所不同)中分配的。这是为了确保所有对象能够共享相同的变量副本。 2. **生命周期**:类变量的生命周期与类相同,当类被加载时...
2. **永久代(Permanent Generation)**:在Java 8及以下版本中,类的信息、静态变量等数据存储在此区域。在Java 9之后,这部分功能被Metaspace替代。 3. **程序计数器(Program Counter Register)**:当前线程所...
5. 操作数栈:JVM使用一个先进后出(FILO)的数据结构来存储局部变量和中间计算结果,这个结构就是操作数栈。所有指令都是基于操作数栈来执行的,例如,将值推送到栈上(push),从栈上弹出值(pop)等。 6. 参数与...
堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI调用的本地方法服务。 3. 指令集:JVM使用一套基于栈的指令集,这些指令...
它主要用于存储方法调用过程中的局部变量、操作数栈等数据。每个线程在其生命周期内都会有一个对应的堆栈结构,其中包含了一个或多个帧(Frame)。每个帧对应一个方法调用,包含了该方法的局部变量表、操作数栈以及...
加载过程中,字节码被转换为内存中的数据结构,并在方法区(在JVM规范的早期版本中称为永久代,现代JVM中称为元空间)中存储。同时,会在堆中创建一个`java.lang.Class`对象,作为方法区数据的封装。 2. 连接(Link...
4. **内存分配**:类变量存储在方法区(在Java 8及之后版本的元空间Metaspace),而实例变量则存储在堆内存中。因为类变量是所有对象共享的,所以它们只有一份副本。 5. **访问方式**:类变量可以通过类名直接访问...
方法区是用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据的区域。 执行引擎是 JVM 的核心组成部分,它负责读取运行时数据区的字节码,并逐个执行它们。执行引擎可以分为两种类型:解释器和 JIT ...
3. **方法区**:存储类信息、常量、静态变量等,也称为永久代,在现代JVM中通常被元空间(Metaspace)替代。 ### 垃圾收集(Garbage Collection) JVM自动进行内存清理,防止内存泄漏。垃圾收集器主要有串行、并行...
- JVM指令是字节码,每条指令对应一个特定的操作,如加载和存储变量、算术运算、控制流程、对象创建和方法调用等。 - 指令手册会列出所有这些指令,比如`iconst_5`表示将整数5压入操作数栈,`aload_0`用于将局部...
栈主要用于存储基本类型、局部变量和方法调用的指令,而堆则用于存储对象实例及其属性。在JVM中,内存管理还包括垃圾收集(GC)机制,它负责清理不再使用的对象,以便释放内存资源。 静态方法和静态属性是Java类的...
隐式加载是在程序运行过程中,当碰到通过new等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。显式加载是通过class.forName()等方法,显式加载需要的类。 类加载器 Java中的类装载器实质上也是类,功能是...
栈帧中包含局部变量表(存储方法中的变量,基本类型直接存储,对象引用存储其地址),操作数栈(用于方法内部变量的计算),动态连接(存储方法调用的引用),以及方法返回地址(用于方法结束后的返回)。...
JMM规定所有变量都存储在主内存中,每个线程有自己的工作内存,工作内存中保存了该线程使用的变量的副本。线程对变量的所有操作都在工作内存中进行,不能直接操作主内存中的变量。 #### 线程通信的实现 线程之间的...
- **类索引**:指向常量池中该类全限定名的索引。 - **父类索引**:如果该类有父类,则指向父类的常量池索引;如果没有,则为0。 - **接口索引集合**:如果该类实现了接口,则列出这些接口的索引。 - **字段表集合**...
方法区存储类信息、常量、静态变量等。程序计数器记录下一条要执行的指令地址,本地方法栈服务于Java的Native方法。 在JVM性能优化中,我们重点关注垃圾收集(GC)和内存管理。GC的主要任务是自动回收不再使用的...