JVM入门学习笔记

1、jvm的位置?

 2、jvm的结构体系?

3、类加载器

 1、虚拟机自带加载器

2、启动类加载器

3、扩展类加载器

4、应用加载器

 双亲委派机制:第一步:类加载器收到类加载的请求。第二步:将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器。第三步:启动类加载器会去检查是否能加载当前这个类,能加载加结束,使用当前加载器,否则,则抛出异常,通知子类去加载。

总结:向上委托,向下加载。

4、沙箱安全机制

5、native

凡是带了native的关键字,说明java的作用范围达不到了,会去调用底层c语言的语法,会进入本地方法栈,然后调用本地方法接口。JNI的作用:扩展java的使用,融合不同的语言为java所使用。

6、方法区

静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在于方法区中,但是实例变量存在堆内存中,和方法区无关。

7、栈

栈内存,主管程序的运行,生命周期和线程同步。线程结束,栈内存就释放,对于栈来说,不存在垃圾回收问题,一旦线程结束,栈就over。

栈中存放的东西:8大基本引用类型+对象引用+实例的方法。

简单类实例化过程:

子类实例化过程:

 8、堆

一个jvm只有一个堆,但堆的大小是可以调节的。堆中细分三个区域:新生区 养老区  永久区。

GC垃圾回收,主要是伊甸园和养老区。经过研究,99%的对象都是临时对象。

在jdk8以后,永久存储区叫元空间。

新生区:伊甸园:类诞生和成长的地方,甚至死亡。

永久区:jdk1.6之前,永久代,常量池在方法区;jdk1.7 永久代,慢慢退化,去永久代,常量池在堆中;jdk1.8之后,无永久代,常量池在元空间。

这个区域常驻内存,用来存放jdk自身携带的class对象,interface元数据,存储的是java运行时的环境或信息,这个区域不存在垃圾回收,关闭这个区域会释放这个区域的内存。

当伊甸园和幸存区都满了走重gc

 10 、GC

JVM在进行gc时,并不是对三个进行统一回收,大部分的时候,回收的都是新生代。

GC有两种:轻gc  重gc

GC题目:

jvm的内存模型和分区 详细到每个区域放什么?

堆里面的分区有哪些?Eden from to 老年区 说说他们的特点?

GC的算法1有哪些:标记清除法,标记整理法 复制算法 引用计数法

轻gc和重gc分别在什么时候发生?

轻gc:是在 Eden 区快满的情况下才会触发;

重gc:

  1. 对于一个大对象,我们会首先在Eden 尝试创建,如果创建不了,就会触发Minor GC
  2. 随后继续尝试在Eden区存放,发现仍然放不下
  3. 尝试直接进入老年代,老年代也放不下
  4. 触发 Major GC 清理老年代的空间
  5. 放的下 成功
  6. 放不下 OOM

引用计数法:

复制算法:

 

 好处:没有内存碎片;坏处:浪费了内存空间;

复制算法最佳使用场景:对象存活度低;

标记整理法:

 

 优点:不需要额外的空间。

缺点:两次扫描严重浪费时间,会产生碎片。

标记压缩:

再优化:

总结:

内存效率:复制算法>标记清除法>标记压缩法(时间复杂度)

内存整齐度:复制算法=标记压缩法>标记清除法

内存利用率:标记压缩算法=标记清除算法>复制算法

 年轻代:存活率低 复制算法;

老年代:标记清除+标记压缩法;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值