- 类加载
java类文件经过编译(javac)会生成class文件,程序启动时会将class文件加载到虚拟机中方法区(method area),class文件类大小会影响永久代内存大小。
类加载器分类:
1.Bootstrap ClassLoader (加载jre/lib/rt.jar)
2.Extension ClassLoadder(加载jre/lib/ext路径下的jar)
3.App ClassLoader(加载classpath的类)
4.pluginClassLoader(插件类加载器,常用的只有前三级)
Bootstrap <-- Extension <-- App
启动时候由 App ClassLoader逐级向上校验是否已经加载该类,若加载则不重复加载,同时也保证了类的安全性。ClassLoader加载前文件校验器会校验class文件是否被正确编译。(此外还有安全管理器去进行校验,默认是关闭的)。
JVM分区,如图(图没找到高清的 -_-!):
当程序被访问时,系统会生成一个线程,每个线程会在栈中生成一个栈帧。栈中存储定义的变量和基本类型值,以及对象类型的引用。堆中则存储对象实例。
- 关于GC
现在JVM采用的是分代垃圾回收机制,分为年轻代、年老代、持久代。
- 年轻代(Young Generation):一个Eden区,两个Survivor区。Eden满之后移到一个Survivor区,再满移到另一个Survivor区,没回收的将放到年老代。
- 年老代(Old Generation):存放的为生命周期较长的对象,存满会触发Full GC。
- 持久代(Permanent Generation):存放静态文件,class类、静态方法等。
- Xms:初始内存
- Xmx:最大内存
- Xmn:年轻代内存
- PermSize:持久代内存
- UseParNewGC:年轻代并行收集算法
- UseConcMarkSweepGC :年老代并发收集算法
set JAVA_OPTS=-server -Xms512m -Xmx1120m -Xmn400m -XX:PermSize=256m -XX:MaxPermSize=400m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
java -Xmx<n> -version (n为JVM所能使用最大内存,=堆+方法区+栈)
java -d64 -version -- jdk版本
- 内存溢出:
- java heap space:调整堆内存大小
- PermGen space:调整持久代内存
- Unable to create new native thread:无法创建线程,栈内存=JVM内存-堆内存-方法区内存(永久代),默认栈大小为1M,可以通过Xss设置或者调整堆内存和方法区内存比例。