Java运行包括4个方面,Java代码(.java)、Java编译文件(.class),Java虚拟机,Java应用程序接口。Java代码通过编译器编译成为类文件,然后被装载到字节码内存中,通过类加载放入虚拟机中,最后通过操作系统和适配器实现,而JVM则处于核心地位。
Java虚拟机
Java虚拟机是java基础部分,Java语言具有跨平台的特性,这也是由JVM来实现的。更准确地说,是Sun利用JVM在不同平台上的实现帮我们把平台相关性的问题给解决了。Java语言支持通过JNI(Java Native Interface)来实现本地方法的调用,但是需要注意到,如果你在Java程序用调用了本地方法,那么你的程序就很可能不再具有跨平台性,即本地方法会破坏平台无关性。JVM包括类加载子系统、运行数据区、执行引擎和本地方法接口。
(生命周期总结:当一个java程序启动时,JVM就产生一个实例;程序结束是,实例也就消失了。Java虚拟机通常开始与一个main方法,这个方法是public static void修饰,JVM要调用必须是public,并且不通过对象调用,所以是static,而且由于JVM已经是底层,不会有任何返回,返回类型就成了void。)
运行时数据区
即内存空间,通常我们配置-Xms、-Xmx信息都是设置的内存,Xms表示初始内存,Xmx表示最大内存,Xmn表示设置年轻代内存等等。内存空间主要由Java堆heap、方法区method area、本地方法栈、程序计数器、Java栈组成。其中Java堆、方法取每个线程公有,而本地方法栈、程序计数器、Java栈是线程私有。
程序计数器
一块较小的内存空间,是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过线程轮流切换执行,一个确定时刻,一个处理器确切说是一个内核,只会执行一条线程的指令,为了线程切换能够恢复正确位置,所以需要有一个独立的程序计数器。
Java虚拟机栈
同样为线程私有,就是java方法执行的内存模型,每个方法执行时都会同时创建一个栈帧,用户存储局部变量表、操作栈、动态链接、方法出口信息。每一个方法被调用直至完成过程,就是入栈到出栈的过程。
局部变量表存放了各种基本数据类型,对象引用类型(一个指向对象起始地址的引用指针,或者一个代表对象相关的位置),和returnAddress类型(指向一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,并且空间已经固定,不会改变。
(后期学习:查看java字节码,使用 javap -verbose class文件;java -verbose文件名称 注此处没得后缀 是查看加载了哪些jar包和文件;javac -verbose java文件 是看虚拟器加载类哪些东西)
本地方法栈
本地方法栈与Java栈基本一样,只不过Java虚拟机栈是处理java方法(字节码)服务,而本地方法栈是为虚拟机使用Native方法服务。
Java堆 Heap
Java堆是虚拟机内存中最大的一块,Java对是被所有线程共享的一块内存区,用来存放对象实例。Java堆也是垃圾收集器管理的主要区域,由于现在垃圾收集器基本都是采用的分代收集算法,所以Java堆基本可以分为新生代、老年代和持久代,新生代再分为Eden空间、From survivor空间和To survivor空间。
新生代:用于存放新生的对象,对象在分配时首先分配到Eden区,当Eden区没有足够空间时,就会进行一次minor GC。通过-Xmn设置新生代大小,-XX:NewRatio=参数 设置新生代与老年代的内存空间比,-XX:SurvivorRation=参数 设置Eden区和Survivor比。
当Eden区进行minor GC后,如果对象经过一次回收并且还存活,能被Survivor去接收,就会移到Survivor(From)区,包括原From去中的对象,并将其年龄设置为1,每熬过一次minor GC年龄就会加1,当达到一定年龄后,就会晋升到老年代中。每次进行GC操作(Eden和From区),From区对象引入to区,并且和To区进行逻辑互换,保证一个Survivor区是空的,如果在放入To或者survivor区中内存不够时,会被放入Old区。Survivor设计成为两个区,应该回收中筛选更符合Old区条件的对象,因为Old区进行回收代价比较高
老年代:存放生命周期长的对象,或者是大对象(包括Eden区或者Survivor区无法放下的对象),当Old区被占满时就会进行完成的垃圾回收Full GC(Major GC)包括新生代。Full GC完成后,留下来的内存就会方法Permanent区(持久代)中。
方法区
方法区和Java堆一样,是各个线程共有的公共区域,用来存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也可以被称作“永久代”,但两者本质上并不一样,只是把GC分代收集扩展到方法区了,相对Java堆而言,垃圾收集行为在访法区比较少见,主要针对常量池的回收和对类型的卸载。
运行时常量池
运行时常量池是属于方法区的一部分,是存放编译期生成的各种字面量和符号引用,当类被加载后,这些信息就会放入到访法区运行时常量池中。另外,运行区常量还具有动态特征,不要求常量一定要在编译期产生,运行期间也可能将新的常量放入常量池中,如String的intern方法。
直接内存
不是JVM中一部分,是由于new I/O 可以使用native直接分配堆外内存,然后通过存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
- 大小: 79.3 KB
分享到:
相关推荐
《深入Java虚拟机学习》是一本专注于Java虚拟机(JVM)原理的书籍。它不仅适合初学者了解JVM的基本概念,也非常适合有一定基础的开发者进一步探索JVM内部的工作机制。本书详细介绍了JVM的各个组成部分以及它们如何协同...
总结来说,“一个简单的Java虚拟机实现(v032)”是一个C++编写的初级JVM示例,旨在帮助初学者了解Java虚拟机的基本工作流程。虽然它可能不包含完整的JVM特性,但对于学习JVM的内部机制和字节码执行过程而言,是一个...
JAVA虚拟机(JVM)是Java语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能在任何支持JVM的平台上运行,实现了“一次编写,到处运行”的目标。JVM规范定义了Java程序如何在特定系统上被加载、解析、...
《Java虚拟机特性JAVA SE 7.pdf》是一本详细介绍Java虚拟机(JVM)规范的书籍,针对Java SE 7版本。本书由Tim Lindholm、Frank Yellin、Gilad Bracha和Alex Buckley共同编写,于2011年7月发布最终版本。本书涵盖了JVM...
本总结将深入探讨Java虚拟机的学习要点,主要分为三个部分:垃圾回收、运行时数据区域和对象。 首先,我们来关注垃圾回收。垃圾回收是Java的一大特色,它自动管理内存,避免了程序员手动释放内存可能导致的错误。...
Java虚拟机性能参数调优是一项复杂但极其重要的任务。通过深入了解JVM的运行机制,合理设置各种参数,可以显著提升Java应用的运行效率,降低资源消耗,为企业带来更高的经济效益。开发者应持续关注JVM的新特性和技术...
Java虚拟机(JVM)性能参数调优是提升Java应用程序性能的关键步骤,尤其是在大型系统和企业级应用中。本文档旨在提供一个详细的指导,帮助开发者理解JVM的运行机制,并有效地调整相关参数以优化系统性能。 1. **...
总结起来,《Java虚拟机规范(Java SE 7)》涵盖了JVM的各个方面,对于深入理解Java程序的运行机制、优化代码性能以及调试问题具有极高的价值。这份PDF文档的高清版,带有完整目录和书签,方便开发者快速查阅和学习...
Java虚拟机是一个可以执行Java字节码的抽象计算机。它包括以下几个主要组成部分: - **类加载器**:负责读取字节码文件,并将其转换为JVM可以理解的形式。 - **运行时数据区**:包括方法区、堆栈、本地方法栈等,...
根据提供的文件信息,我们可以推断出这是一份关于获取《Java虚拟机精讲》PDF版本的资源链接。接下来,我们将围绕这一主题展开讨论,重点介绍Java虚拟机的基础知识、核心概念以及该书中可能涵盖的一些重要知识点。 #...
JAVA虚拟机学习路线,思维导图,总结JVM的总体情况。跟着来学习,事半功倍
#### 一、Java虚拟机规范的重要性 - **定义与标准**:《Java虚拟机规范》作为Java虚拟机的基础性文档,不仅定义了Java虚拟机的基本概念,还提供了统一的标准来确保不同的Java虚拟机实现能够保持一致的行为。这对于...
《深入JAVA虚拟机第二版》是一本专注于Java虚拟机(JVM)的权威指南,针对JVM的深入了解和优化提供了详尽的解析。这本书对于Java开发者、系统管理员以及对Java性能调优感兴趣的读者来说,是不可或缺的参考资料。下面...
Java技术自诞生以来就以其“一次编写,到处运行”的理念而备受赞誉,而这一理念的核心实现正是Java虚拟机(JVM)。为了深入理解Java虚拟机的工作机制,本文将从其架构、组件、执行流程等角度详细阐述JVM的运作原理。...
总结来说,"Java虚拟机学习"资料会带你深入了解JVM的工作原理,掌握JMM如何保证并发安全,理解类加载的全过程,以及如何利用和优化GC机制。这些知识不仅有助于提升代码质量,也能为解决实际开发中的性能问题提供理论...
Java虚拟机(JVM)是运行Java应用程序的核心组件,它提供了一个可移植、安全且高性能的环境。本文将深入探讨JVM的内部架构及其各个组成部分的功能。 #### 二、Java虚拟机的内部组件 Java虚拟机的内部组件可以分为两大...
1. **类加载机制**:Java虚拟机如何加载类文件到内存中,包括加载、验证、准备、解析和初始化五个阶段。 2. **内存模型**:描述了Java虚拟机如何管理内存空间,包括方法区、堆、栈等区域的划分及其作用。 3. **垃圾...