本文内容来源于互联网,并稍作整理。
JVM主要包括两个子系统和两个组件
一、子系统
1、Class loader(类装载器)子系统
2、Execution engine(执行引擎)子系统
二、组件
1、Native interface(本地接口)组件
2、Runtime data area(运行时数据区域)组件—JVM内存
Runtime data area包括五部分
①、Heap
②、Method Area(存储装载的类信息)
③、Java Stack
④、Program Counter(程序计数器)
⑤、Native method stack(本地方法栈)
其中①Heap和②Method Area被所有线程共享使用,③、④、⑤ 以线程为粒度,每个线程独自拥有。
①、Heap
一个JVM实例只存在一个Heap空间,每个Java程序独占一个JVM实例。一个Java程序的多个线程共享同一个堆空间。
Heap分为New Generation、Old Generation。
New Generation
用于存放程序中新建的对象,由Eden Space和两块Survivor Space构成。通过-Xmn参数来指定其大小。
Old Generation
存放程序中经过几次垃圾回收还存活的对象。占用的内存大小即为-Xmx指定的大小减去-Xmn指定的大小。
Permanet Generation
存放静态文件,持久代对垃圾回收没有显著影响,但有些应用可能动态生成或者调用一些class,例如Hibernate等,此时需要设置一个较大持久代空间来存放。持久代大小通过-XX:MaxPermSize=
进行设置。
②、Method Area(存储装载的类信息)
(1)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,可见方法区域的重要性,同样,方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
(2)在Sun JDK中这块区域对应的为Permanet Generation,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小。
③、Java Stack
以帧为单位保存线程运行状态。JVM只会直接对Java stack执行两种操作:以帧为单位压栈或出栈。每当线程调用一个方法时,就对当前状态作为一个帧保存到java
stack中;当一个方法调用返回时,从java stack弹出一个帧(出帧)
④、Program Counter(程序计数器)
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
⑤、Native method stack(本地方法栈)
对于运行中的Java程序而言,会用到和本地方法相关的数据区。调用本地方法时,不受虚拟机限制。
异常与参数
1、java.lang.OutOfMemoryError:java heap space
New Generation和Old Generation空间不足,参数-Xms和-Xmx。
2、java.lang.OutOfMemoryError: Java Permanent Space
永久存储区空间不足,-XX:PermSize和-XX:MaxPermSize
-Xss 单个线程堆栈大小值;JDK1.5以后每个线程堆栈大小为1M,以前为256K。
-XX:+UseParNewGC可用来设置年轻代为并发收集(多cpu),如果服务器多cpu,开启此参数多cpu并发收集垃圾。
+UseParallelGc,选择垃圾收集器为并行收集器。此配置仅对年轻代有效。
-XX:ParallelGCThreads 年轻代并行垃圾收集的前提下的线程数,增加并发度。最好与处理器数目相等。
-XX:PermSize 应用服务器启动时,永久存储去的初始内存大小。
-XX:MaxPermSize 应用运行中,永久存储去的极限值,默认值为64M。
生产环境-XX:PermSize和-XX:MaxPermSize强烈推荐值设为相同
-Xms 启动应用时,JVM堆空间的初始大小值,默认值是物理内存的1/64但小于1G。
-Xmx 应用运行中,JVM堆空间的极限值,默认值是物理内存的1/4但小于1G。为了不消耗扩大JVM堆控件分配的开销,参数和-Xms这两个值设为相等,考虑到需要开线程,将此值设为内存的80%。
-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。
分享到:
相关推荐
6. **使用与集成**:JVM-Sandbox通常通过Maven或Gradle等构建工具引入到项目中,然后通过API或者配置文件定义切面规则,即可实现所需功能。项目的源代码(如`jvm-sandbox-master`)包含详细的示例和文档,可以帮助...
6. **异常处理**:介绍异常在JVM中的处理方式,包括如何抛出、捕获和处理异常,以及栈跟踪信息。 7. **多线程与并发**:讲解JVM中的线程创建、同步机制(如synchronized、Lock),以及并发容器(如...
项目名为"jvm-rs-main",通过这个项目,我们可以深入学习Rust语言与JVM的交互,以及如何构建一个简化版的JVM。 一、Rust语言的魅力 Rust是一种系统级编程语言,它强调安全、并发和速度。它的内存管理模型避免了空...
理解OS意味着掌握进程管理、内存管理、文件系统、设备驱动、网络通信等基本原理,这对于优化Java应用的性能和理解JVM与系统的交互至关重要。 5. **汇编语言**:汇编语言是低级编程语言,与机器指令一一对应,用于...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码,这是Java程序在编译后的二进制...理解这些知识点对于深入学习JVM的工作原理,优化Java代码性能,以及解决部署环境与开发环境之间的兼容性问题至关重要。
在深入探讨JVM(Java虚拟机)的理论与实践结合时,我们首先需要理解JVM在Java编程中的核心地位。JVM是Java平台的核心组成部分,它负责执行编译后的Java字节码,使得Java程序具备跨平台的能力。在这个解密JVM-day04的...
《深入理解JVM-2Edition-类文件结构》是一份详细阐述Java虚拟机(JVM)如何处理类文件的文档。类文件是Java程序编译后的二进制表示,其结构直接影响了Java的平台无关性和语言无关性。下面将详细探讨类文件的各个组成...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
其源代码结构清晰,适合学习和研究,对于想深入了解JVM的人来说,这是一个极好的资源。 JVM的主要功能包括类加载、字节码解释执行、编译优化、内存管理(尤其是垃圾回收)、多线程支持以及异常处理等。在JikesRVM中...
1. **理解内存区域与内存区域异常**:学习JVM的内存结构,包括程序计数器、Java堆、虚拟机栈、本地方法栈、方法区和运行时常量池等,并了解它们发生异常的原因。 2. **掌握Java堆内存溢出异常的测试**:通过编写...
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
JVM 内存结构和 6 大区域 JVM 是 Java虚拟机,它是 Java 语言的核心组件之一,为 Java 程序提供了运行环境。JVM 的内存结构是 Java 程序的基础,它的设计和实现对 Java 程序的性能和可靠性产生了深远的影响。 JVM ...
在程序运行过程中,JVM会进行内存分配,执行方法,处理异常,直到程序正常结束或异常退出。 JVM的体系结构是一个复杂的系统,主要由以下几个关键组件构成: 1. **类加载器(ClassLoader)**:负责查找和加载类文件...
### JVM体系结构与GC调优 #### 一、JVM体系结构概述 Java虚拟机(JVM)是Java运行环境的基础部分,它为Java程序提供了一个独立于平台的执行环境。JVM的主要职责包括:加载Java类到内存、管理运行时数据区域、执行...
1. **JVM结构与工作原理**: - 类加载机制:了解类如何被加载、验证、准备、解析和初始化,以及双亲委托模型。 - 运行时数据区:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等各个区域的作用和管理策略。 ...
JVM在Java平台结构中处于中心位置,通过移植接口与底层操作系统和硬件交互。移植接口由适配器和Java操作系统两部分构成,适配器针对特定平台进行优化。JVM的抽象规范在《Java Virtual Machine Specification》一书中...
当try块中的代码执行时,如果出现异常,控制权会立即转移到相应的catch块,如果没有catch块,JVM会尝试向上层的try-catch结构传递异常。 2. **catch 代码块**:紧随try块之后,用于捕获特定类型的异常。每个catch块...
7. 异常处理与线程:JVM支持异常处理和多线程。源码可能包含异常的抛出、捕获和多线程同步、通信的实例,帮助理解JVM如何处理这些情况。 通过对"jvm-demo-code-master"中的源代码进行学习和分析,开发者可以更深入...
本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几个核心知识点: 1. **类装载器的层次结构**:Java的类装载器采用双亲委派模型,即当一个类装载器接到加载类的...
与虚拟机栈类似,但它是为JVM内部调用的native方法服务的。当本地方法执行完毕,对应的栈帧也会被移除。 5. **程序计数器(Program Counter Register)** 这是最小的一块内存区域,用于记录当前线程正在执行的...