looker_good
looker_good
采纳率100%
2017-11-28 03:10

JVM内存 Perm Gen永久代

10
已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

14条回答

  • looker_good looker_good 2年前

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

    点赞 评论 复制链接分享
  • u013025029 zongfug 4年前

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

    点赞 评论 复制链接分享
  • yxp858757656 Budding... 4年前

    《深入理解java虚拟机》这本书还是不错的,可以看看

    点赞 评论 复制链接分享
  • qq_41203870 qq_41203870 4年前

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

    点赞 评论 复制链接分享
  • baidu_24903053 baidu_24903053 4年前

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

    点赞 评论 复制链接分享
  • likaihui_1129 likaihui_1129 4年前

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

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

    点赞 评论 复制链接分享
  • weixin_41201266 weixin_41201266 4年前

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

    点赞 评论 复制链接分享
  • httphosts httphosts 4年前

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

    点赞 评论 复制链接分享
  • httphosts httphosts 4年前

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

    点赞 评论 复制链接分享
  • Hellokk_12138 Hellokk_12138 4年前

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

    点赞 评论 复制链接分享
  • wlz0706 wlz0706 4年前

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

    点赞 评论 复制链接分享
  • sharleneli sharleneli 4年前

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

    点赞 评论 复制链接分享
  • qq_41200647 qq_41200647 4年前

    debogger

    点赞 评论 复制链接分享
  • qy7383190 qy7383190 4年前

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

    点赞 评论 复制链接分享

相关推荐