微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM知识点

 

类加载器类别:

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

类加载器作用:

双亲委派机制:

  • 类加载器收到类加载请求(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用的是分代收集算法:新生区,存活率低使用复制算法,老年区存活率大,使用标记清除+标记清除压缩算法(在多少此标记清除后使用标记清除压缩提高内存利用率)

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐