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