jvm

jvm

  1. jvm的理解 虚拟机有什么更新
  2. 什么是OOM stackOverflowError 有哪些方法分析
  3. jvm常用的调优参数
  4. jvm类加载器的认识

jvm的体系结构概述

Object o = new Object();
MyObject myObject = new MyObject();
System.out.println(o.getClass().getClassLoader());
System.out.println(myObject.getClass().getClassLoader());

ClassLoader |只负责文件加载 是否可以运行由 Execution Engine决定

User.class - >ClassLoader -> user Class[模板]

方法区就是类的模板

ClassLoader 粗说3个 细说4个

启动类加载器 BootStrap C++

在rt.jar 中 系统自带 Object

扩展类加载器 Extension java

路径 jre->lib->ext

sun.misc.Launcher$AppClassLoader@18b4aac2

应用程序类加载器 AppClassLoader
MyObject myObject = new MyObject();
System.out.println(myObject.getClass().getClassLoader());
System.out.println(myObject.getClass().getClassLoader().getParent());
System.out.println(myObject.getClass().getClassLoader().getParent().getParent());

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@6e0be858
null
自定义加载器
双亲委派机制

就是从上到下找 - 案例:自己定义String类

沙箱安全 保证自己写的代码不污染JAVA 代码

native

自己搞不定 需要外援

new Thread()

thread.start() start0

thread.start() //会报错

寄存器

排版值日表

执行引擎 知道下一个要执行的方法的地址

线程私有 很小 不存在GC

方法区

1:存储类的结构信息 线程共享 较少的垃圾回收

2:方法区是规范 不同虚拟机实现不一样 永久代 元空间

重点:堆 栈stack

stack管运行 堆管存储

栈 先进后出 跟随线程的生命周期 不存在GC回收

保存哪些东西 基本类型 对象的引用变量 实例的方法

队列

栈帧 == 方法 例如: main()

栈溢出 stackOverFlowError 递归方法 无终止条件

 String str = "hello";
 while(true) {
     str = str + new Random().nextInt(88888888)+new Random().nextInt(999999999)+new Random().nextInt(999999999)+new Random().nextInt(999999999)+new Random().nextInt(999999999);
 }

// Byte[] bytes = new Byte[40 * 1024 * 1024];

java.lang.OutOfMemoryError: Java heap space

栈 堆 方法区的交互关系

指针方式对中的实例数据

栈中存指针 实例对象 来自方法区的模板

堆体系结构的概述

new新生区 伊甸园区 幸存者0from 幸存者1to

注意:from 和 to GC后存在交换 谁空谁是to

​ 默认15次 静茹老年代区

old养老区 养老区满了就会 FullGC 如果还是不行 OutOfMenoryError

永久区==8换成元空间

新生区 1/3 伊甸园 8/10 from 1/10 2 1/10

老年区2/3

heap 堆

98%的对象都是临时对象 伊甸园生 伊甸园死

方法区 类信息 普通常量 静态变量 编译器 还有一个别名叫做 Non-heap 非堆

永久代 元空间 就是落地实现

插曲 String 是引用 但是存储在,存在常量池中 常量池 是方法区的一部分

堆参数调优入门

元空间用的是物理内存 默认只用内存的1/4

-Xms 1/64 初始

-Xmx 1/4 最大

现实:最大最小 一样大

-Xms1024M -Xmx1024M -XX:+PrintGCDetails

System.out.println(Runtime.getRuntime().maxMemory() / (double) 1024 / 1024);
System.out.println(Runtime.getRuntime().totalMemory() / (double) 1024 / 1024);

981.5
981.5
Heap
PSYoungGen total 305664K, used 15729K [0x00000007aab00000, 0x00000007c0000000, 0x00000007c0000000)
eden space 262144K, 6% used [0x00000007aab00000,0x00000007aba5c420,0x00000007bab00000)
from space 43520K, 0% used [0x00000007bd580000,0x00000007bd580000,0x00000007c0000000)
to space 43520K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007bd580000)
ParOldGen total 699392K, used 0K [0x0000000780000000, 0x00000007aab00000, 0x00000007aab00000)
object space 699392K, 0% used [0x0000000780000000,0x0000000780000000,0x00000007aab00000)
Metaspace used 3106K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 341K, capacity 388K, committed 512K, reserved 1048576K

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

​ GC前的内栈用 GC后新生代(新生代总大小)

[GC (Allocation Failure) [PSYoungGen: 1427K->490K(1536K)]

GC前总内存 后内存 总内存

5116K->4179K(5632K), 0.0007979 secs]

[Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC (Ergonomics

[PSYoungGen: 359K->0K(1536K)]

[ParOldGen: 3894K->1042K(4096K)] 4253K->1042K(5632K),

[Metaspace: 3209K->3209K(1056768K)], 0.0014423 secs]

[Times: user=0.00 sys=0.00, real=0.00 secs]

垃圾回收GCde理解

分代收集算法 | 次数上频繁收集YONG 次数上较少收集old 基本不动元空间 15次

先minotGC

GC算法总体概述 fullGC 要比YONGGC慢8-10被 old区比较大

sysytem.gc 手动释放

java main方法 2个线程 主线程GC线程

GC四大算法

引用计数 计数本身也有消耗 循环引用不高处理

复制算法 最常用的方法(minORgc中)

GC之后 有交换 水空谁是to

优点不存在碎片 缺点 form -》 to 一样大 消耗空间

标记清除 用在old区

可回收 标记起来 然后拔掉

1:空间节约 碎片出来 2速度慢 挑选的过程

标记压缩整理 用在old区

标记的整理一下 就不存在碎片了 缺点 就是慢工 出细活

总结

posted @ 2020-10-25 15:43  z_先生  阅读(103)  评论(0编辑  收藏  举报