jvm中有:
方法区:method Area 存类的信息
堆 :Heap 存对象信息
虚拟机栈: jvm stacks 存 方法内局部变量、方法参数
本地方法栈: native method stacks : 加载的是native 修饰的方法
程序计数器:pc register 记录当前线程执行到第几行
1. 只有计数器不会出现内存溢出
2. 出现OutOfMemoryError :
对象越来越多,一直在使用:堆内存耗尽
类越来越多: 方法区内存耗尽
线程越来越多:虚拟机栈耗尽。
3. 出现stackOverflowError:
方法调用次数过多,把线程内内存耗尽: 虚拟机内部
4. jvm 参数: -xmx 最大内存 -xms 最小内存 -xmn 新生代内存数 -xx 新老总内存数...
5. jvm垃圾回收算法:
标记清除、标记整理、标记复制
6. GC
回收区域是堆内存,大部分采用分带回收思想,按规模分为MinorGC、MixedGC、FullGC
7 . 分代回收:把内存分为:伊甸园、幸存区、老年代。
8. 发现垃圾: 引用计数算法、跟搜索算法
9. jvm调优:
-Xmx3550m:设置JVM 最大可用内存为3550M。
-Xms3550m:设置JVM 初始内存为3550m。
-Xmn2g:设置年轻代大小为2G。
-Xss256k:设置每个线程的栈大小。
-XX:NewRatio=4:设置年轻代和老年代比值。...
10. 类加载过程
1. 加载- 将类的字节码文件载入方法区,并创建 .class对象,如果这个类有父类则先加载父类,属于懒惰加载。
2. 连接:验证类是否规范,为static分配空间,将常量池符号引用解析为直接引用
3. 初始化:执行静态代码块和非final静态变量的赋值,懒惰执行。
11. 双亲委派
委派上级类加载器进行加载,如果找到,则上级加载,加载后该类对下级加载器可见,找不到,下级类加载器加载,对上级不可见。
12. 对象引用类型:
强引用、软引用softReference、弱引用WeakReference、虚引用PhantomReference