一:java内存区域和内存溢出测试
java内存分为线程共享的区域(方法区,堆)和线程不共享的区域(虚拟机栈,本地方法栈,程序计数器):
1,方法区:存放类信息,常量,静态变量,即时编译后的代码等。产生大量的类来填充方法区来测试方法区内存溢出。
2,堆:对象实例,包括数组。如果想要堆内存溢出,直接新建大量对象,然后保持对它的引用便可以了,
3,虚拟机栈:局部变量表(基本数据类型和对象引用),操作数栈,动态链接,方法出口等。因为没一个方法都是一个栈帧,大量的循环调用方法,必然会产生虚拟机栈溢出。
4,本地方法栈:类似虚拟机栈,执行native方法,具体不详。
5,程序计数器:当前线程执行的字节码的行号指示器。
书中有个好例子:
如果在一个方法A中有这么一句: Object obj = new Object(); 那么当执行A方法的时候,在当前线程的虚拟机栈中会开辟一个新的栈帧,Object obj 这句话会在栈帧中声明一个变量,反应到jvm中便是在虚拟机栈中有一个对象引用reference类型数据出现在栈帧中,new Object()是新建一个对象,自然会在堆中开辟一片区域,用来存放这个对象,obj对象属于Object这个类,这个Object类的名字,实现的接口,有哪些方法等这些类的信息都存放在方法区中,堆中的对象会有一个指针指向方法区中的Object类。
二:垃圾收集和对象分配
怎么判断对象应该被回收,两种方法:引用计数和根搜索算法,引用计数解决不了循环引用的问题,根搜索算法的根节点有如下几种:
1:本地变量表引用的对象
2:方法区中的类静态属性引用的对象
3:方法区中的常量引用的对象
4:本地方法栈中jni的引用的对象
基本的垃圾收集算法有三种:
1:标记清除算法,就是先用上面的方法标记,然后统一清除,缺点是会产生大量的碎片。
2:标记整理算法,算法是标记完一个对象后直接把这个对象移动到整个内存区域的另一端,然后整体清除内存。
3:复制算法,用一半来存对象,收集时把存活下来的复制到另一半,当然一半的比例可以调整,当大量的对象存活时效率较低,所以可以用在新生代,因为新手代的对象存活较低。
现在流行的把堆内存分代,按照对 象的存活年龄来分为新生代和老年代,新手代的对象存活时间较短,用复制算法比较好,因为每次复制的对象很少,老年代可以用标记清除和标记整理,因为一般存活的对象较多,需要做清除操作比较少。
参考:《深入理解java虚拟机》周志明
分享到:
相关推荐
jvm--java毕业设计-JVM内存模型和垃圾收集PPT37页--JVM内存模型和垃圾收集
**JVM内存模型及垃圾收集策略解析** Java虚拟机(JVM)是Java程序运行的基础,它为Java程序提供了一个跨平台的运行环境。在深入理解JVM内存模型与垃圾收集策略之前,我们首先需要知道JVM的主要组成部分:类装载器、...
JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。
### JVM内存模型与垃圾收集详解 #### 一、引言 在现代软件开发领域,Java作为一门广泛应用的编程语言,其运行环境Java虚拟机(JVM)对于程序的性能有着极其重要的影响。特别是在服务器端程序中,合理的内存管理和...
总的来说,理解和掌握JVM内存模型及垃圾收集策略对于优化Java应用程序的性能至关重要。开发者需要根据应用特点调整内存参数,选择合适的垃圾收集策略,以避免内存溢出、提高系统效率并确保程序的稳定运行。
1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这部分被元空间(Metaspace)取代。 - **运行时常量池**:是方法区的一部分,...
第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...
Java虚拟机(JVM)内存模型...理解JVM内存模型和垃圾回收机制对于优化Java应用性能、避免内存泄漏和有效利用资源至关重要。开发者应根据实际需求选择合适的垃圾回收器,并关注内存分配策略,以实现高效稳定的程序运行。
它描述的是 Java 方法执行的内存模型:每个方法被执行的时候都会创建一个栈桢用来存储局部变量表、方法出入口信息等。 3. 本地方法栈:此区域与虚拟机栈起到的作用类似,只不是过虚拟机栈是针对 Java 方法而这个...
首先,我们来了解JVM内存模型。在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。堆内存是所有对象实例的存储区域,而栈内存则用于存储基本类型和对象引用。此外,JVM内存还包含方法区(Method Area)、程序...
通过以上对JVM内存模型和垃圾收集策略的分析,可以看出JVM内存管理的复杂性以及垃圾收集机制的重要性。了解和掌握这些知识点,对于开发高性能Java应用是非常有帮助的。在实际开发过程中,合理配置JVM参数、选择合适...
### JVM内存模型详解 #### 一、概述 Java虚拟机(JVM)是Java程序运行的基础环境,它提供了一套完整的内存管理和执行机制。本文旨在深入探讨JVM内存模型的关键组成部分及其工作原理。 #### 二、类加载器...
1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...
《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...
JVM内存模型内置了基于内存的并发模型,支持多线程机制,提供了同步锁(Synchronization)功能,使得在多线程环境下能够确保数据一致性。此外,JVM还提供了大量的线程安全的库包,这些特性使得开发者可以灵活控制...
JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java Virtual Machine Stacks)**...
JVM内存模型则是理解Java程序性能优化的关键,因为它规定了程序中的数据如何在内存中分配和访问。本文将深入浅出地探讨JVM内存模型,帮助你快速掌握这一核心概念。 首先,我们要知道JVM内存模型主要分为以下几个...
此外,JVM内存管理还包括垃圾收集(Garbage Collection, GC),其目标是自动释放不再使用的对象所占用的内存。GC有不同的算法,如分代收集、标记-清除、复制、标记-整理等,选择合适的GC策略可以有效地平衡程序的...