在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中
如果上面写的是对的,那么在我们静态变量用多了的情况下,就会出现java.lang.OutOfMemoryError: PermGen space
所以那个permSize一直不释放是合理的,因为static变量JVM一般情况下是不会去回收。我刚才看了一下我们状态的所有JAR包也只有一百二十几M,但是为什么我们设年MaxPermSize为占用百分之九十几?而且一直在往上增长,这就说明初始化加载class的时候加载class字节码,meta信息之外,Perm方法区会随着程序的运行而不断增大,这时候,问题就来了。所以static变量得慎用啊。。。。。
除了上述的内容会存储在方法存储区或永久存储区之外(Pernanet Gerneration)
,还有:要加载类的信息(名称,修饰符等),类中的静态变量,类中定义为final
类型的常量,类中的Field信息,类中的方法,当开发人员在程序中通过Class对象
的getName,isInterface等方法来获取信息时,这些数据都来源瑜方法区,
在一定的条件下也会被GC,当方法区域要使用的内存超过其允许的大小时,
会抛出OutOfMemory的错误信息。
static成员变量得慎用 有木有? 特别是那种会一直增加的static成员变量
那有的东西必须保存在内存中,那怎么办?除了perm永久方法存储区之外,不是不家堆栈吗?
那我们就可以把我们的程序设置单实例的,或者搞一个工厂方法去取这个类的实例就OK了。
说到单实例,必须说明一点,我们靠Spring去维护单实例不靠谱,Spring的单实例只限于单个IOC容器内,但是一个JVM中可以存在多个IOC容器,特别是多人开发,然后又是基于JAR包的作合作时,出出问题还搞不清楚到底是哪里的问题。所以。。。。利用Spring来保持程序的单实例可以,但最好这种单例只有某个模块用,而不会涉及到别的部门会引用到的情况,比如那个状态中的缓存队列用Spring来维持它的单实例,从设计的角度看,这是不靠谱的,一个服务需要单实例,需要从设计的角度让其去单实例,而不是基于使用者合理的使用Spring的基础上去控制其单实例,如果有一个人new ApplicationContext(.. ) 创建了一个IOC怎么办?那不就造成了上次状态造成的OOM了吗?
保证唯一实例的方法多的去了,工厂行吗?单实例行吗?
随感一下。
分享到:
相关推荐
解决 JVM 中的 PermGen space 问题 PermGen space(Permanent Generation space)是 JVM 中的一块永久保存区域,用于存放 Class 和 Meta 信息。当应用程序加载 Class 时,Class 就会被放入 PermGen space 区域中,...
java对象在jvm中的存储情况 jvm
方法区的大小可以通过JVM参数进行设置,如在JDK7及之前,使用-XX:PermSize和-XX:MaxPermSize来设定永久代的初始和最大分配空间,以防止因加载过多类信息导致的“ PermGen space”内存溢出。而从JDK8开始,HotSpot ...
JVM优化方法
学习 09 方法区, 记录方法区相关知识,重绘图示和 PPT。 文章包括栈、堆和方法区交互、方法区基本概念、方法区的演进、方法区的内部结构、方法区垃圾回收等相关内容。
自己总结的jvm中方法区的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
VisualVM是一款强大的Java虚拟机(JVM)性能分析和监视工具,由Oracle公司开发并提供。它集成了一系列功能,如内存分析、线程检查、CPU消耗监控、类加载和垃圾收集等,使得开发者能够深入了解应用在JVM上的运行状况...
在JDK8中,JVM内存结构发生了显著变化,尤其是元空间(MetaSpace)替代了永久代(Permanent Generation)作为方法区的一部分。这种方法区的调整是由于永久代存在的一些问题,比如大小设定困难,容易引发溢出,以及给...
堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI调用的本地方法服务。 3. 指令集:JVM使用一套基于栈的指令集,这些指令...
用于存储方法的局部变量、操作数栈和方法返回地址。每个线程都有自己的虚拟机栈,每当线程调用方法,都会在栈中创建一个栈帧,对应一个方法的执行上下文。当方法执行完毕,对应的栈帧也会被弹出。 3. **本地方法栈...
栈用于存储方法调用的状态,包括局部变量表、操作数栈和动态链接。 - **方法区**:存储类和接口的信息,如常量池、字段和方法数据。 - **PC寄存器**:记录当前线程正在执行的字节码指令地址。 - **本地方法栈**:...
方法区域(在HotSpot JVM中称为Metaspace)用于存储类的元数据,包括类的信息、静态变量、常量、Field信息和方法信息等。这部分区域是全局共享的,当需要的内存超出其容量限制时,会抛出`OutOfMemoryError`。 #####...
在Java虚拟机(JVM)中,PermGen space(永久代)是用于存储类的信息、常量、静态变量等数据的区域。在Java 8之前,PermGen space 是HotSpot JVM的一部分,并且它的大小可以通过JVM参数进行调整。 当PermGen space的...
JVM 调优方式 JVM 调优是一种非常重要的技术,它能够帮助我们提高 Java 应用程序的性能和稳定性。在这篇文章中,我们将探讨 JVM 调优的重要性和各种调优方式。 首先,需要注意的是,在对 JVM 内存调优的时候不能只...
### Tomcat JVM内存设置方法详解 #### 一、前言 Tomcat作为一款广泛使用的Java应用服务器,其性能优化一直是开发者关注的重点之一。而在性能优化的过程中,合理设置JVM(Java Virtual Machine)内存是非常关键的一...
第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...
- **方法区**(在Java 8后变为元空间):存储已加载类的信息,如类的元数据、常量池等。 - **虚拟机栈**:每个线程都有一个独立的虚拟机栈,用于存放方法调用时的局部变量表、操作数栈和方法出口等信息。 - **...
内存管理涉及JVM内存区域,包括堆、栈、方法区、程序计数器和本地方法栈,每部分都有其特定的用途和管理方式。 2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。...
方法区是JVM中存储类信息的区域。方法区中存储了类的信息,包括类的局部变量、方法、父类引用等。方法区是JVM中最重要的部分,它是Java虚拟机的核心机理。 常量池 常量池是JVM中存储常量的区域。常量池中存储了类...
1. **内存监控**:`jvm-mon`能够显示堆内存、非堆内存(如 PermGen 或 Metaspace)的使用情况,包括总大小、已分配、已使用以及剩余空间等信息,帮助开发者发现内存溢出问题。 2. **GC活动追踪**:它会记录垃圾收集...