JVM内存 Perm Gen永久代

我在测试测序里写了死循环,循环内sleep 1秒,在监控内存发现,永久代内存使用一直在增加,所以,想知道永久代的内存是如何分配的,
Perm Gen是方法区,那么每创建一个对象,都会加载对应类的方法吗,如果不断创建同一个类的多个对象,方法会继续加载吗,方法不是共用的
吗,如果是这样,gc不会管理到这块内存,程序跑久了肯定要oom了呀。永久代占内存一直增加,是说明每次对象的方法单独占内存吗?还有一个问题,创建的新对象在堆内存中,那么堆内存中保存的只是对象的成员变量吗(成员方法保存在永久代?),对象中对别的对象的引用又是保存在哪里?对象的引用(例如People p = new People()),p本身(不是指对象)又在内存的那一块?哎呀呀,问题太多了,求大神解答!

14个回答

已阅读《深入理解Java虚拟机》

《深入理解java虚拟机》,先看完这本书

looker_good
looker_good 老哥稳,你要是看完了就解答一下,你要是没看完就赶紧去看吧
2 年多之前 回复

debogger

《深入理解java虚拟机》,先看完这本书

这么多问题,你没有把一个描述清楚,怎么回答

looker_good
looker_good 就两个问题,1:Perm Gen 内存的原理,为什么使用量会持续增加;2:一个对象在内存中,成员变量和成员方法分别在哪块内存上
2 年多之前 回复

perm创建对象,不会每次都加载方法

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。
Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区

qq_35209952
逗泥丸的平方 这句话就矛盾了~ 不过满的时候的确是会触发FGC,并且FGC会"顺便"清理永久代的 当然J8之后这个概念的确不太重要了.
3 个月之前 回复

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号

《深入理解java虚拟机》,先看完这本书

《深入理解java虚拟机》,先看完这本书

共14条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐