新生区、永久区、堆内存调优
新生区
- 类:诞生和成长的地方,甚至死亡;
- 伊甸园,所有的对象都是在伊甸园区new出来的!
- 幸存者区(0,1)
老年区
真理:经过研究,99%的对象都是临时对象!
永久区
这个区域常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些环境或类信息这个区域不存在垃圾回收!关闭JVM虚拟就会释放这个区域的内存
一个启动类,加载了大量的第三方jar包。Tomcat部署了太多的应用,大量动态生成的反射类。不断的被加载。直到内存满,就会出现OOM;
- jdk1.6之前︰永久代,常量池是在方法区;
- jdk1.7 :永久代,但是慢慢的退化了,
去永久代
,常量池在堆中. - jdk1.8之后∶无永久代,常量池在元空间
逻辑上存在:物理上不存在
package com.wang.jvm;
public class Demo02 {
public static void main(String[] args) {
//返回虚拟机试图使用的最大内存
long maxMemory = Runtime.getRuntime().maxMemory();
//返回JVM的初始化总内存
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("maxMemory="+maxMemory+"字节\t"+(maxMemory/(double)1024/1024)+"MB");
System.out.println("totalMemory="+totalMemory+"字节\t"+(totalMemory/(double)1024/1024)+"MB");
//默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64
}
//OOM:
//1.尝试扩大堆内存看结果
//2.分析内存,看一下哪个地方出现了问题(专业工具)
//-Xms1024m -Xmx1024m -XX:+PrintGDetails
}