出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法原因:堆内存的永久保存区内存分配不足(缺省默认为64M),导致内存溢出错误。 解决的方案大致可以分为两种: 1、重新分配内存大小,-Xms1024M -Xmx2048M -XX:PermSize=128M -XX:MaxPermSize=256M 2、允许GC回收永久区:-XX:+UseC            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-04 10:42:40
                            
                                155阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            很多人会误以为Java内存区域和内存模型是同一个东西,其实并不是。Java内存区域是指 JVM运行时将数据分区域存储 ,简单的说就是不同的数据放在不同的地方。通常又叫 运行时数据区域。Java内存模型(JMM)定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。1、Java内存区域1.8 之前:           JDK1.8(含)之后:            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-05 15:50:12
                            
                                91阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            如何保证缓存和数据库一致性说了这么多缓存的必要性,那么使用缓存是不是就是一个很简单的事情了呢,我之前也一直是这么觉得的,直到遇到了需要缓存与数据库保持强一致的场景,才知道让数据库数据和缓存数据保持一致性是一门很高深的学问。从远古的硬件缓存,操作系统缓存开始,缓存就是一门独特的学问。这个问题也被业界探讨了非常久,争论至今。我翻阅了很多资料,发现其实这是一个权衡的问题。值得好好讲讲。以下的讨论会引入几            
                
         
            
            
            
            前言JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、程序计数器。本文将逐一讲解每个区域,并理解他们之间的关系JAVA内存模型方法区主要用来存储类的元信息(类名、属性名、属性签名、方法名……)以及静态变量, 是线程共享的, 所有的类被类加载器加载到jvm中的时候, 会提取类的元信息存储到方法区方法区可以说是一种            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-27 14:12:30
                            
                                177阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在 Java 虚拟机内存中是如何存放的 ?Java 虚拟机在为类实例或成员变量分配内存是如何分配的 ?是的,这两个问题就涉及到了JVM 内存结构的知识了,那么这篇文章将进行解答。@目录1、内存结构还是运            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-07-26 14:58:38
                            
                                54阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            几种OOM异常?堆溢出:java.lang.OutOfMemoryError: Java heap space 堆中new的对象太多了,申请不到空间时会抛出 OutOfMemoryError栈溢出:java.lang.StackOverflowError方法创建了一个很大的对象,如 List,Array。
是否产生了循环调用、死循环。
是否引用了较大的全局变量。永久代溢出:java.lang.Ou            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-06-22 15:00:43
                            
                                50阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            一、JVM 运行时数据区  根据 JVM 规范,JVM 运行时数据区共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。  1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-05-15 12:54:15
                            
                                31阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            # Java的元数据空间配置浅析
在Java虚拟机(JVM)中,元数据空间是用于存储类元数据的内存区域。理解和配置元数据空间对于Java开发者来说尤为重要,尤其是当处理大量类或动态生成类时。本文将探讨元数据空间的概念、其配置方法,以及一些代码示例,并结合序列图和状态图进行详解。
## 一、什么是元数据空间?
元数据空间是JVM从Java 8开始引入的特性,它取代了之前版本中使用的永久代(Pe            
                
         
            
            
            
            内存空间jvm启动运行Class文件时对JVM内存进行切分,可以将其分为线程共享区和线程隔离区jvm运行时内存架构如下:在JDK8中持久代(Permanent Generation)部分数据移到了元数据区(Metaspace),在JDK8中已经没有持久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-04-07 18:37:26
                            
                                98阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            方法区Method元空间主要是存储类信息 线程共享 JVM启动时才能被创建,可以在物理空间上不连续系统定义太多的类可能会导致方法区溢出-----》OOM(比如:加载大量第三方Jar包;tomcat部署工程过多;大量动态的生成反射类)元空间和永久代的最大区别:元空间不在虚拟机设置的内存中,而是使用本地内存①栈、堆、方法区的交互关系很重要!!! ②设置方法区大小与OOMJdk7之前:通过-x            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-11-02 07:54:28
                            
                                210阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            要是没有实践过别人书本上的理论的话,就还是会说常量池在方法区里面,要是知道方法区已经随jdk升级,被逐步干掉的话,额,也不能说被干掉,只是被优化了,这又体现了看书的程度深浅了,就会看到有的文章说常量池移动到heap堆里面了,还有极少的说移动到Metaspace里面了,产生了分歧。这个时候就需要实践出真知了。/**
 * 测试 常量池在分区的位置
 *
 * @author LiXuekai on             
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-27 23:35:00
                            
                                239阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)以下是JVM内存模型中方法区的变动   1.新生代:Eden+From Survivor+To Survivor2.老年代:OldGen3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中) 方法            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-16 07:20:55
                            
                                258阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            前言JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用元空间(Metaspace)代替了永久代。永久代和元空间保存的数据并不完全一样,永久代中还保存另一些与类的元数据无关的杂项。在Java 7里将字符串常量从永久代移动到了堆区域,但是永久代并没有完全改造完成。直到Java 8,永久代的改造才            
                
         
            
            
            
            # 元空间(Metaspace)与Java内存管理
在Java中,内存管理一直是开发者关心的焦点之一。随着Java 8的发布,元空间(Metaspace)取代了之前版本中的永久代(Permanent Generation,Perm Gen),这个变化对Java开发者来说至关重要。在本文中,我们将探讨元空间的概念及其在Java内存管理中的作用,并提供相关的代码示例和实现说明。
## 什么是元空间            
                
         
            
            
            
            Java内存模型的内部结构取决于使用哪个JVM,尽管在高层的情况是相似的。JVM中有两个主要的内存区域—堆和堆栈。局部变量和方法驻留在堆栈上,其他的都在堆上。Java堆内存结构Java堆内存分为不同的区域,称为代:年轻一代(伊甸园Eden和幸存者Survivor空间)老一代(终身空间)永久代(permGen)当一个新的物体第一次被创造出来时,它就属于年轻一代。当年轻一代填满时,它会导致一个小的垃圾            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-21 15:34:12
                            
                                81阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            # Java元空间
在传统的Java虚拟机中,方法区用来存放类的相关信息,如类名、方法信息等,而在Java 8之后,方法区被替换为了元空间(Metaspace)。元空间是Java虚拟机中存放类元数据的区域,它与传统的方法区相比有许多优势,比如可以动态扩展,不再有固定的大小限制,同时,元空间可以通过命令行参数进行设置,灵活性更高。
## 元空间的特点
1. 动态扩展:元空间可以根据应用程序的需            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-04-28 06:43:26
                            
                                142阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            Java1.7及之前的虚拟机在运行中会把它所管理的内存分为如下图的若干数据区域。其中,虚拟机栈,本地方法栈以及程序计数器为线程隔离。方法区和堆是所有线程共享的数据区域。这里我们主要要介绍的是方法区。方法区用于存储已被虚拟机加载的类信息、常量、静态变量、动态生成的类等数据。实际上在Java虚拟机的规范中方法区是堆中的一个逻辑部分,但是它却拥有一个叫做非堆(Non-Heap)的别名。对于方法区的实现,            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-23 23:14:51
                            
                                205阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            当前许多java框架中大量使用注解,如Hibernate、Jersey、Spring。 
     什么是元数据 Metadata 描述数据的数据(data about data),主要是 
 描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 
   
  从信息资源中抽取出来的用于说明其特征、内容的结构化的数据(如题名、            
                
         
            
            
            
            • 堆内存溢出 – 堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值, 就会出现内存溢出OutOfMemory:Java heap space • 永久代溢出 – 类的一些信息,如类名、访问修饰符、字段描述、方法描述等,所占空间大于永久代最大 值,就会出现OutOfMemoryError:PermGen space两种内存溢出 1、堆内存溢出:本质原因是代码有问题,创            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-10-27 00:07:51
                            
                                98阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            一、说明当虚拟机申请不到内存空间的时候,会报堆内存溢出: OutOfMemoryError:java heap space。我测试到时候,运行在 16G 内存的机器上。JVM 堆内存 默认为物理内存的1/4,即 16 * 1/4 = 4GJDK 8的 JVM 在 JDK 7 的基础上从堆内存中移除了永久代(Perm Generation),替换为了堆内存之外的元空间(Metaspace),元空间是            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-10-06 10:42:28
                            
                                170阅读
                            
                                                                             
                 
                
                                
                    