JVM常见知识点总结

JVM常见知识点总结

1、JVM的位置
可以把JVM理解为一个应用程序,它是运行在操作系统之上的,我们在安装java运行环境JRE的时候,里面就已经包含了JVM。

2、JVM的体系结构
在这里插入图片描述
栈内存中不存在GC(因为栈就是方法不断的压栈、出栈,如果有垃圾会发生堵塞,不可能有垃圾的),所以常说的JVM调优指的是操作堆内存

3、类加载器
应用程序加载器、扩展类加载器、根加载器(启动类加载器)
4、双亲委派机制
当我们创建类,并且执行方法时。会先去根加载器下面找有没有这个类,如果有,就执行根加载器下的类和方法,而不会再执行本地创建的。当根加载器下没有时,会去扩展加载器下找有没有这个类,如果有,就执行扩展加载器下的类和方法,而不会再执行本地创建的。如果没有,才会执行本地应用程序加载器。
(1)、类加载器收到类加载的请求
(2)、将该请求向上委托给父类的加载器去完成,一直向上委托,直到根加载器
(3)、根加载器检查能否加载该类,能加载就结束了,使用当前的根加载器去加载即可。如果不能,抛出异常,通知子加载器进行加载(扩展、应用)
(4)、重复3过程

5、Native
凡是带了native关键字的,说明java的作用范围达不到了,会去调用底层C语言的库。native标记的方法会进入本地方法栈,然后通过本地方法库去调用本地方法接口(JIN), 这样可以扩展java的使用,融合不同的语言为java所用(本地方法库和本地方法接口的作用就是可以调用访问底层的C、C++所写的库)。

6、PC寄存器(程序计数器)
每个线程都有一个程序计数器,是线程私有的,执行下一条指令时候加1,可以保证线程能够有序不乱的运行(有1,2,3,4,5,6,7,8这些顺序编号)

7、方法区
方法区线程共享,里面存放 静态变量、常量、代码片段(.class字节码文件)、运行时的常量池。JDK1.8之前,方法区有自己单独的空间,JDK8之后,方法区存在于堆内存的元空间(永久区)中,也就是,方法区属于堆了

8、栈
(1)一个线程一个栈,线程结束,栈内存释放
(2)不存在垃圾回收问题
(3)存放 局部变量(8种基本数据类型)、方法、对象的引用

9、三种JVM
HotSpot(我们只用这个)、JRockit、J9VM

10、堆
(1)一个JVM只有一个堆内存,所以它里面会有很多垃圾。堆内存大小可以调节
(2)堆中主要存放 实例变量、对象
(3)堆主要包括,新生区、老年区、永久区(元空间)。GC垃圾回收机制主要存在于新生区中的伊甸园区和老年区
(4)OOM(OutOfMemoryError):堆内存溢出,堆内存满了会报此错
在这里插入图片描述

11、新生区、老年区
新生区:创建对象时(new Student())就是在新生区里的伊甸园区创建的。它是类诞生和死亡的地方。大部分对象是临时对象,会在伊甸园
区用完以后直接被轻GC杀死,少部分会跑到幸存区(from、to),
极少会进入到老年区

12、永久区(元空间)
永久区常驻于内存,用来存储JDK自身携带的Class对象,也就是java运行时的一些环境,不存在垃圾回收。一般永久区是不会出现OOM的,除非几个特殊情况:一个启动类加载了大量的第三方jar包、Tomcat部署了太多的应用。
元空间逻辑上存在,物理上不存在
在这里插入图片描述

14、遇到OOM怎么办:
(1)OOM原因:新生区创建对象,存在于伊甸园区,不断的创建,不断的用轻GC回收,如果对象不多,轻GC完全可以应付在伊甸园区就把垃圾清理完毕。但是如果对象过多,产生的垃圾过多,就会跑到幸存区,这时候轻GC还在努力地做清理工作,如果垃圾还是在不断的产生,过多,那么就会跑到老年区,这时候,重GC就会登场,重GC的清理范围会比轻GC大得多,它会清理新生区、老年区里的所有垃圾。当垃圾过多,老年区也存满了,重GC也顶不住的时候,就会报OOM堆内存溢出的错误。
2、解决方法(堆内存调优):

(1)尝试扩大堆内存空间,观察运行结果,如果正常了,说明是
堆内存空间不足导致的
-Xms1024m -Xmx1024m -XX:+PrintGCDetails(打印GC信息)
-Xms:设置初始化内存分配大小
-Xmx:设置最大内存

(2)分析内存,看一下哪个地方出现了问题(专业工具Jprofiler)
在IDEA中安装Jprofiler插件,当报出OOM错误时,在IDEA
中设置Dump文件:
Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError,此时就会Dump出一个文件,然后用Jprofiler就可以打开这个文件,通过文件里面的信息就可以准确判断出程序是在哪里甚至哪几行出现了问题,然后就可以去修改。

15、GC(常用算法)
a)标记清除法

在这里插入图片描述

优点:不需要额外的内存空间
缺点:两次扫描,严重浪费时间,会产生内存碎片

b)标记压缩法
对标记清除算法进行再次优化,再次扫描,向一端移动存活的对象

在这里插入图片描述

c)复制算法:新生区主要使用复制算法。当伊甸园区满了,垃圾会进入幸存区(from、to),遵循谁空谁是to的原则,在from和to之间不断的进行交换操作。假如from、to都有数据,那么此时就需要把其中一个区的数据复制到另一个区,然后就腾出来一个空的区作为to区以方便后续的存放垃圾,这就是复制算法。每一次GC过后,伊甸园区和to区都是空的。当15次GC还没有回收掉的垃圾(默认15次,可以修改),就会进入到老年区。

优点:没有内存碎片
缺点:浪费了一半内存空间(to区永远是空的)。当垃圾过多时,从from
区复制到to区的成本太高。所以复制算法最佳使用场景:对象存活
度较低的时候,也就是在新生区使用。

d) 引用计数法(对每个对象的引用次数进行计数,次数为0的就回收。这种方法很少用,因为对象太多了,每个都计数太浪费空间了)

e)总结各个算法

		         内存效率:复制算法>标记清除>标记压缩(次数最多)
		         内存利用率:标记压缩>标记清除>复制算法(一半空间为空)
		没有最好的算法,只有更合适的算法。所以GC算法也被称为分代收集算法。

在新生区一般使用复制算法,在老年区一般使用标记清除+标记压缩(具体的清除多少轮再进行压缩是个关键,当内存碎片不多时候可以继续再进行清除,当碎片很多了再进行压缩,这也是JVM调优的关键步骤)混合实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★★★★ 23 六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 九、 java.lang.Object 31 十、 异常★★★★ 34 十一、 包(package) 37 十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 String字符串:★★★☆ 71 StringBuffer字符串缓冲区:★★★☆ 73 StringBuilder字符串缓冲区:★★★☆ 74 基本数据类型对象包装类★★★☆ 75 集合框架:★★★★★,用于存储数据的容器。 76 Collection接口 77 Iterator接口 78 List接口 78 Set接口 80 Map接口 81 把map集合转成set的方法 82 使用集合的技巧 83 Collections--集合工具类 83 Arrays—数组对象工具类 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 System 89 Runtime 90 Math 90 .Date:日期类,月份从0—11 92 Calendar:日历类 93 十六、 IO流:用于处理设备上数据 ★★★★★ 94 IO流的概念 95 字符流与字节流 98 流对象 101 File类 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础之网络协议篇 111 UDP传输 124 TCP传输 126 十八、 反射技术 127 十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 二十一、 设计模式★★★★★ 136 设计模式简介 136 单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201 享元模式 204 代理模式★★★★★ 208 责任链模式 212 命令模式 216 解释器模式 219 迭代器模式 222 中介者模式 224 备忘录模式 226 观察者模式 230 状态模式 233 空对象模式 236 策略模式★★★★★ 238 模板模式 240 访问者模式 244 设计模式总结★★★★★ 247 二十二、 Java其他总结 248 Java JVM知识点总结 248 equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值