JVM内存框架图
注: 上图的序号是从左向右进行标记,序号顺序不代表逻辑关系
下面我们将按逻辑关系进行介绍
1 JVM Process Heap
32位OS:最多约2GB
64位OS:更多。
2 Java Object Heap(JAVA Heap)
通常被称为JVM heap ,容易和JVM process Heap混淆,它是用来存储java OBject的如:
Object的实例和Object的基本数据及引用。
-XX:MinHeapFreeRatio=
Default is 40 (40%)
-XX:MaxHeapFreeRatio=
Default 70%
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小 于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。
3、Young Generation
所有新创建的Object 都将会存储在这里。
配置方式 :
-Xmn – not preferred (fixed value)
-XX:NewRatio=<value> - preferred
(dynamic)
官方推荐的配置是新生代(Young Generation)占整个Java Object Heap内存的33%
4、Eden Space
新的Object总是创建在Eden Space。
5、Old Generation
如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。
6、Survivor Spaces
GC时,Eden中活的对象复制到surivivor spaces ,当对象达到最打值(老化)时,被送到Old Generation
10、Tenured Space
5MB min 44MB max (default)
这就是传说中的老年代,官方给的解释就是:
pool containing objects that have existed for some time in the survivor space.
11、Everything else
这其实就是我们常常见到的no-heap
12、Permanent Space
4MB initial , 63MB max
存储class的函数及其他的meta Data.
配置方式:
-XX:PermSize=<value> (initial)
-XX:MaxPermSize=<value> (max)
13、Code Generation
转换byte code 为native code.
基本不会导致内存异常。
如果该操作没有足够的空间,JVM可能会导致崩溃。
14、Socket Buffers
包括两部分:1:Receive buffer ~37k 2:Send buffer ~25k
需要在JAVA代码中来控制他,所以在外部无法配置。
他可能导致的异常:IOException: Too many open files (for
example)
15、Threaded JVM Stacks
jvm stacks:
jvm stack: frame data 、operand stack ...
Thread Stacks:
表示各个Thread所分配的空间。
默认至取决于OS/JVM
线程数增加,Thread Stacks则增大。
配置: –Xss
异常:java.lang.OutOfMemoryError:
unable to create new native thread
如果-Xss配置的太小,会引起
java.lang.StackOverflowError
16、Direct Memory Space
他可以让开发人员映射内存到java Object Heap外。
配置: XX:MaxDirectMemorySize=<value>
17、JNI Code 、
JNI code本身使用的内存非常小。
19、JNI allocate memory
JNI 程序本身也需要分配内存。
18、Garbage Collection
其实GC也是需要内存的,gc线程的消耗以及存放GC所缓存的信息。
这里简单介绍下GC的历史:
GC始于1959 –LISP语言
他的初衷:
1、 自动内存清理
2、 让开发变得简单
3、 让debug更方便
Gc的过程
1、锁(Lock it down)
所有对象在GC时会被锁定,以保证他们不会变化。
2、标记(Mark)
遍历所有对象,标记 不可到达阶段的对象(unreachable)为 垃圾(需要回收)
3、清理(Sweep)
删除所有被标记对象
清理内存
GC在早及的JAVA版本中的问题
1、GC不能很好的协调。
2、只有一个算法。
3、标记(Mark)、清理(Sweep)需要扫描整个Heap,需要花费很久的时间。当然该时间取决与堆的大小。所以人们发明了永久性空间(Permanent Space)
GC工作原理:
Eden——所有新创建的对象都被放置在这里。
Survivor——当Eden区空间不足时,会将其中依旧存活的对象拷贝到两块Survivor区域(FromSpace和 ToSpace)中的一个,如果此时这个Survivor区域也空间不足,则将该块区域中存活的对象拷贝到另一块区域中。 注意,总有一个Survivor区域是空的。
对Young Generation的垃圾回收叫minor GC,通常很多的对象都活不过一次GC。
Old Generation——但一个Survivor区域满了的时候,会将该区域中已经历一定次数GC而依旧存活的对象放到Old Generation中。如果Old Generation也满了,那就要Full GC了。Full GC很耗性能,当Full GC进行时,应用程序会暂停。由于大部分对象都活不过一次GC,所以如果服务器上频繁的发生Full GC,就要关注下是不是出问题了。
三、引起的异常
java.lang.OutOfMemoryError: Java heap space
原因:Heap内存溢出,意味着Young和Old generation的内存不够。
解决:调整java启动参数-Xms -Xmx 来增加Heap内存。
java.lang.OutOfMemoryError: unable to create new native thread
原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
java.lang.OutOfMemoryError: PermGen space
原因:Permanent Generation空间不足,不能加载额外的类。
解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。
解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。
在GC花费了大量时间,却仅回收了少量内存时,也会报出OutOfMemoryError ,我只遇到过一两次。当使用-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC收集器时,在上述情况下会报错,在HotSpot GC Turning文档 上有说明:
The parallel(concurrent) collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown.
对这个问题,一是需要进行GC turning,二是需要优化程序逻辑。
java.lang.StackOverflowError
原因:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
解决:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
IOException: Too many open files
原因: 这个是由于TCP connections 的buffer 大小不够用了。
java.lang.OutOfMemoryError:Direct buffer memory
解决:调整-XX:MaxDirectMemorySize=<value>
相关推荐
### Java技术框架图知识点概述 #### 1. Java类加载器架构 Java 类加载器是 Java 虚拟机(JVM)的一个关键组件,负责在程序运行时动态地加载类和接口。它按照一定的顺序加载类,并确保每个类只被加载一次。Java 类加载...
- **直接内存(Direct Memory)**:不在JVM内存区内,通过`java.nio.ByteBuffer.allocateDirect()`方式分配内存。 ##### 2. HotSpot运行时数据区域关系图 HotSpot虚拟机是Sun Microsystems开发的一款高性能的JVM实现...
标题 "框架->java语言->jvm->os->汇编->硬件" 描述了一条技术学习路径,从上至下深入理解软件开发的核心技术栈。这个路径涵盖了从应用框架到底层硬件的关键环节,让我们逐步解析其中涉及的知识点: 1. **框架**:...
1. **JVM内存模型**: - **堆内存(Heap Memory)**:分为新生代(Young Generation)、老年代(Tenured Generation)和持久代(Permanent Generation)。新生代用于存放新创建的对象,老年代存放生命周期较长的...
1. **JVM内存结构**: - **堆内存**:Java对象的出生地,分为新生代和老年代,新生代又分为Eden区和两个Survivor区。 - **方法区**:存储类信息、常量、静态变量等元数据。 - **栈内存**:每个线程都有独立的栈,...
1. JConsole:这是Java自带的一款图形化监控工具,可以实时监控JVM的内存、线程、类加载等状态,辅助开发者分析和诊断问题。 2. JVisualVM:它提供了一个全面的视图,包括性能监视、线程分析、内存检测等功能,同时...
- **2002年**:Classic VM退出历史舞台,此时的Java生态系统已经非常成熟,各种工具和框架逐渐完善。 - **2004年**:JDK 1.5发布,带来了泛型、注解等新特性。 - **2011年**:JDK 7发布,增加了对模块化等新特性的...
**JVM内存管理** - **新生代**:主要用于存储新创建的对象,采用复制算法进行垃圾回收。 - **老年代**:存放存活时间较长的对象,使用标记-压缩或标记-整理算法。 - **永久代/元空间**:存储类信息、方法信息等,这...
在准备面试时,掌握Java相关的并发编程、数据结构与算法以及JVM运行时内存是非常关键的。这份"面试资料.zip"包含了一系列与这些主题相关的学习材料,如PDF文档和XMind思维导图,旨在帮助你深入理解并熟练应用这些...
接着,深入理解JVM内存模型至关重要。Java对象在堆内存中分配,而栈内存存储方法的局部变量。理解这些内存区域的分配和回收策略,有助于避免内存泄漏和栈溢出等问题。此外,方法区(在Java 8后被元空间取代)存储类...
理解JVM的工作原理,包括类加载机制、内存管理(堆、栈、方法区等)、垃圾收集(GC)策略以及性能优化,对于提升Java程序的效率至关重要。了解JVM调优技巧,如设置合适的内存参数、选择合适的GC算法,可以帮助解决...
例如,JVM内存设置(如-Xms, -Xmx)可能影响到程序的内存使用,而JDK版本可能影响到某些功能的行为。 4. **异常堆**:在某些情况下,日志会包含异常堆的详细信息,如对象的实例数量、类加载器状态等。这在排查内存...
总之,Java内存监控涉及多个层面,包括使用内置工具、编程接口、理解内存模型、掌握垃圾收集机制以及合理配置JVM参数。通过对这些知识点的深入学习和实践,我们可以有效地管理和优化Java应用的内存使用,提升系统...
在IT行业中,JVM(Java Virtual Machine)是Java应用程序的核心组成部分,它负责执行字节码并管理内存。JVM监控工具对于理解应用性能、优化内存使用、定位问题和故障排查至关重要。以下是一些关于JVM监控工具的重要...
"Java知识框架图"是帮助初学者和有经验的开发者更好地理解和掌握Java全貌的重要工具。下面,我们将深入探讨Java知识体系的主要部分。 1. **基础语法**: - **变量与数据类型**:Java支持基本数据类型(如int、char...
理解JVM的工作原理,包括类加载机制、内存区域(堆、栈、方法区等)、垃圾回收机制(GC)以及性能优化策略,对于解决性能问题和避免内存泄漏至关重要。 2. 数据结构:数据结构是存储和组织数据的方式,如数组、链表...
JMX能够帮助我们获取JVM内存状态、CPU利用率、线程信息以及垃圾收集情况等关键指标。此外,它还支持动态调整日志级别,例如log4j可以通过JMX接口在线调整日志级别。 JMX不仅仅是一个规范,它同时提供了一个框架,...
JVM优化包括调整内存参数(如堆大小、新生代与老年代的比例)、设置垃圾回收策略、减少Full GC的发生、类加载机制优化等。通过这些优化,可以提高应用程序的性能,减少内存泄漏和系统停顿。 2. **MySQL优化**:...
本资源摘要信息主要总结了阿里巴巴面试中的问题和答案,涵盖了 Java 编程语言、设计模式、JVM 内存模型、ClassLoader 结构、UML 模型图、OSGi 框架、Spring 框架、iBatis 框架、Java 序列化、NIO 编程、HTTP 协议、...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及优化代码性能。Arthas是一个强大的Java诊断工具,尤其适合在生产环境中进行问题排查。本压缩包"JVM监控,调优,分析工具(低配版...