线程私有:
栈:入口只有一个 先进后出
虚拟机栈 -Xss(栈容量默认1M):一个方法对应一个栈帧(1局部变量表(基本数据类型/引用地址)2操作数栈3动态连接4返回地址)
高并发 支持更多线程 在内存一定的情况下 减少栈的容量
虚拟机栈异常--StackOverflowerError(递归)执行的虚拟机栈深度大于虚拟机栈允许的最大深度
可把栈内存调大 支持线程则会变小
本地方法栈:native
程序计数器:当前线程正在执行的字节码指令的地址(行号) 就是线程执行到哪了
解决cpu切换线程问题
JVM垃圾回收(java特色)
堆 : java堆被所有线程共享 所有的对象和数组存放区域
-Xmx 堆区内存可能分配的最大上限
-Xms 堆内存的初始内存分配大小
Gc Roots:1虚拟机栈中引用的对象 2方法区:类静态属性引用的对象 常量引用的引用对象
有Gc Roots 引用 是存活对象
新生代(1/3):Eden(80%)、from Survivor(10%) 、Survivorto(10%) 老年代(2/3)
对象分配:
基本上新的对象有限分配Eden
Eden区满了 MinorGc 会送新生代采用回收算法改进版本
form to两个交换区只有一个区有数据
被MinorGc后 Eden 的进入 from、 to
每个对象定义age计数器 每次GC在交换区 后年龄加1 大于15 进去老年代
对象回收:
当Eden区没有足够控件 会发生Gc(age+=1)
90%的对象不需要我们回收(8:1:1)
(Eden-->交换区--》年老代)
大对象直接进去老年代
老年代空间不足 full GC
MinorGc避免不了 Full尽量避免
处理方式:保存堆栈快照日志
分析内存泄漏(100M - 30M不能回收的对象始终占)
调整内存设置控制垃圾回收频率
选择适合的垃圾回收期