1 jdk1.8存储内容
1堆 字符串常量池,静态变量,引用对象的真实对象
新生区
老年区
2方法区-元空间 运行时常量池,静态常量池,类,方法
方法区逻辑上属于堆,但是它有一个别名为Non-Heap(非堆),目的就是为了将其与Java堆区分开。
3栈 8大基本类型,对象引用,实例的方法
Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。
2 分析
1栈 : 数据结构 ----队列
程序 = 数据结构 + 算法 持续学习
栈 先进后出(例如 弹夹), 队列 先进先出(fifo first input first out)
栈内存,主管程序的运行,生命周期和线程同步;
线程结束,占内存也就是释放,对于栈来说,不存在垃圾回收问题。
栈运行原理 :栈帧
栈满了 : StackOverflowError
2堆 一个jvm只有一个堆,大小可以调节
新生区 (伊甸园区和幸存区[from] ,幸存区[to]) 满了触发 轻GC(MinorGC) — from和to会切换引用
老年区 满了触发 重GC(FullGC)
多次循环调用—最后没有可用空间导致 (OOM)OutOfMemoryError 堆内存不够
JVM 99%调优是堆调优
默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存是1/64
用 Runtime().getRuntime().maxMemory();//总内存
Runtime().getRuntime().totalMemory();//初始化内存
-XX:+PrintGCDetails //运行查看GC详情
-Xms1m //堆内存初始值内存1m
-Xmx8m //最大分配内存8m
-XX:+HeadDumpOnOutOfMemoryError //生成dump文件(java 内存快照),可用jprofiler工具打开分析
使用-XX:HeapDumpPath配置的时候,需要保证目录的文件夹都是存在,因为它在到处dump文件的时候,不会帮你去创建不存在的目录。
使用相对路径:
nohup java -Xms512M -Xmx512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar order-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
使用绝对路径:
nohup java -Xms512M -Xmx512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/log/ -jar order-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
GC四大算法
1引用计数法(JVM一般不采取这种算法) 2标记-清除算法(Mark-Sweep)(老年代使用) 3复制算法(copying) (年轻代使用) 4标记整理算法(Mark-Compact) (老年代使用)
升级版 标记-清除-压缩 (Mark-Sweep(标记清除算法 )+Mark-Compact(标记整理算法 )混合实现)(老年代使用)
GC使用的 分代收集算法—分代收集法是目前大部分 JVM 所采用的方法
jvm
jps -l 获取java运行实例
pid + 实例名
jinfo pid 获取运行实例的jvm参数
jstack jconsole jprofiler查看死锁排查等
jprofiler性能分析
评论区