JVM内存结构

 1.哪些部分会出现内存溢出
     ①不会出现内存溢出的区域-程序计数器
     ②内存溢出的两种类型
       Ⅰ出现OutOfMemoryError的情况
           1️⃣堆内存耗尽-对象越来越多,又一直在使用,不能被垃圾回收
           2️⃣方法区内存耗尽-加载的类越来越多,很多框架会在运行期间动态产生新的类
           3️⃣虚拟机栈累积-每个线程最多会占用1M内存,线程个数越来越多又长时间运行不销毁时
       Ⅱ出现StackOverflowError的区域
           1️⃣虚拟机栈内部-方法调用次数过多(递归没有合适的出口)
    

既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?
                这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。
                Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。
                通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收,哪怕是 Java 虚拟机抛出 OutOfMemoryError 。
java既然存在gc线程,为什么还存在内存泄漏? - THISISPAN - 博客园1.既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。 Java中https://www.cnblogs.com/panxuejun/p/5888817.html

方法区与永久代、元空间之间的关系
        ①方法区是JVM规范中定义的一块内存区域,用来存储类元数据、方法字节码
即使编译器
        ②永久代是Hotspot虚拟机对JVM规范的实现(1.8之前)
        ③元空间是Hotspot虚拟机对JVM规范的实现(1.8之后),使用本地内存
作为这些信息的存储空间

JVM内存参数
        对于JVM内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XX:SurvivorRatio=3
其中最小内存值和Survivor总大小分别是
             
   -Xmx:jvm的最大内存数 1024m:10g
        ​​​​​​​        -Xms:jvm的最小内存数 ​​​​​​​ 1024m:10g
                -Xms:jvm的新生代内存数 ​​​​​​​  5120m:5g
                -XX:SurvivorRatio=3      eden:from=3 所以新生代划分为5份 eden3 from1 to1
        所以Survivor:2g               

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值