ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM知识点

2021-04-01 23:00:09  阅读:110  来源: 互联网

标签:知识点 标记 清除 算法 GC 内存 JVM 加载


 

类加载器类别:

  • 虚拟机自带加载器
  • 启动类(根)加载器
  • 扩展类加载器
  • 应用程序加载器

类加载器作用:

  • 加载Class文件,生成类(Class)在方法区

双亲委派机制:

  • 类加载器收到类加载请求(new String(); )
  • 将这个请求向上委托
  • 类加载器加载类过程:应用程序加载器>扩展类加载器>根加载器
  • 如果根加载其中不存在该类抛出异常,就到扩展类加载器中加载,不存在该类抛出异常,最后到应用程序加载器(自己写的类)中加载。
  • 目的:安全,防止篡改(重写String类)

沙箱安全机制:

  • 沙箱是一个限制程序运行的环境,将java代码限定在JVM特定运行范围内,并严格控制代码堆本地资源的访问。
  • 沙箱主要显示系统资源访问(cpu,内存,文件系统,网络)

组成沙箱基本组件:

  • 字节码校验器:(在编译后,由类加载器加载到jvm中)检查变量有没有初始化,有没有违背私有数据,方法调用等规则。
  • 类加载器:防止恶意干涉善意代码(双亲委派机制)。守护被信任的类库边界。将代码归入保护域,确定代码可以进行哪些操作(沙箱安全机制)。

关于native关键字:

  • 凡是带了native关键字的,说明java范围达不到,调用了底层c语言的库
  • 该方法会进入本地方法栈,调用本地方法接口(JNI)执行

程序计数器(PC寄存器):

  • 每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中字节码,在执行引擎读取下执行下一条指令,内存空间非常小

方法区(唯一):

  • 静态变量(static),常量(final),类信息(Class)(构造方法,接口定义),运行时的常量池(区别字符串常量池)存在方法区中。
  • jdk1.8之前逻辑上属于(物理上不属于)堆,实际上和堆其他区域隔离开,1.8后直接在jvm之外了(在 本地内存中)。

堆(唯一):

  • 注意:堆包括方法区
  • 堆大小可以调节
  • 对象实例和数组在堆内存中。
  • 字符串常量池在堆中
  • 堆内存分为三个区域:新生区,老年区,永久区(jdk8以后叫元空间),GC垃圾回收主要是在新生区和养老区
  • OOM:堆内存溢出

字符串常量池存在堆中(*)

  • 一般放字符串,String a="abc",a放在常量池,String b="abc",此时会检查常量池是否存在“abc"存在则b指向其,Srtring c=new String("abc"),c存在堆中。

java栈(不唯一):

在这里插入图片描述

  • 每一个线程都包含一个栈区,栈中只保存基础数据类型和自定义对象的引用(不是对象)
  • 每个栈中的数据(原始类型和对象引用)都是私有的
  • 栈分为3个部分:基本类型变量区、执行环境上下文(一系列栈帧)、操作指令区(存放操作指令)
  • 栈主管线程的运行(方法的调用),生命周期和线程同步,线程结束(线程每调一个方法,就有一个栈帧入栈),对应的栈内存释放。
  • java栈中保存的主要内容是栈帧,栈帧是java具体方法存储数据的地方。每一次函数调用都会有对应的栈帧被压进去java栈,执行完毕的时候被弹出java栈
  • 栈不存在垃圾回收问题。
  • 栈中有:8大基本类型,对象引用(地址指向堆中),方法索引

GC:垃圾回收

  • 分两类:轻GC(发生在新生区),重GC(全局GC)(发生在老年区)
  • 三种算法:标记清除法,标记压缩,复制算法,引用计数法(了解)
  • 复制算法:每次轻GC都会将伊甸园区中活下来对象放入幸存区中(to区),将from区对象也放入to区,清空伊甸园区和to区(此时to区变成from区,from区变成to区),伊甸园区满了再清理,伊甸园区幸存对象和from区对象放入to区,清空from和伊甸园区,一个对象经过15次(默认)轻GC后放入老年区
  • 复制算法好处:没有内存碎片,坏处:浪费内存空间(to区)
  • 复制算法使用场景:对象存活率较低时使用,新生区使用复制算法。
  • 标记清楚算法:标记阶段会通过可达性分析将不可达的对象标记出来(下图文字中应该是对标记的对象清除),清除阶段会将标记阶段标记的垃圾对象清除。
  • 标记清除算法缺点:两次扫描严重浪费时间,会产生内存碎片,优点:不需要额外的空间
  • 标记清除压缩算法:对标记清除算法优化,防止内存碎片产生,多了一个移动成本
  • 引用计数法:给每个对象分配一个计数器,清理最少使用的
  • 时间复杂度:复制算法>标记清除算法>标记压缩算法
  • 内存整齐度:复制算法=标记清除算法>标记压缩算法
  • 内存利用率:标记清除算法=标记压缩算法>复制算法

现在GC用的是分代收集算法:新生区,存活率低使用复制算法,老年区存活率大,使用标记清除+标记清除压缩算法(在多少此标记清除后使用标记清除压缩提高内存利用率)

 

 

 

 

标签:知识点,标记,清除,算法,GC,内存,JVM,加载
来源: https://blog.csdn.net/weixin_38328444/article/details/115375503

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有