堆的内存模型以及ClassLoader

前言

5.21学习内容打卡。

ArrayList线程安全类:CopyOnWriteArratList.
读写分离的思想,在写入时复制原有的list,在复制体中进行写操作,原有的进行读操作,写操作是同步的,读不是。

wait,notifyAll,使用判断的时候必须使用while,不然会造成虚假唤醒。

非公平锁:允许线程插队;公平锁:不允许

老版的同步以及通信:Synchornized->wait->notifyAll
新版的锁: Lock -> Condition.await->Condition.signal,可以精确让哪个线程先执行,哪个后执行。
在这里插入图片描述

方法区不放方法,放类的描述信息。

ClassLoader就像一个快递员,将类的class文件加入到内存当中,并创建一个Class对象。
虚拟机自带的类加载器:启动类加载器(Bootstrap)C++写的
扩展类加载器(Extension),应用程序类加载器(AppclassLoader),自定义类加载器。

双亲委派机制:当一个类收到了类加载的请求,他首先不会加载这个类,而是把请求委派个父类完成。
沙箱安全:双亲委派机制保证了沙箱安全,即外部的操作不会影响到源码,不会改变源码。

native关键字:为了将不同的编程语言融合一起为java所用,就是加了这个关键字就是引用第三方语言实现。

PC寄存器:指明下一个该执行的方法

栈->先进后出类似于子弹夹,栈中保存的是8种基本数据类型的变量,引用类型,实例方法。java的方法就是栈帧,只不过在不同的地方不同的叫法。
StackOverFlowError 栈溢出错误(递归无递归体和递归头可发生这种错误)

方法区在不同的虚拟机实现是不一样的,最典型的就是永久代和元空间。

OOM:内存溢出错误
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述上图所示是堆的组成,在JDK1.8的时候,永久代被换成了元空间。
开始new对象的时候是在伊甸区,如果new的太多会触发gc回收,
清除以后剩下的对象会进入幸存0区(也叫from或者S0),等伊甸区再new多了对象,则又会触发gc回收机制,这次将处理伊甸区和幸存0区两个地方的对象,活下来的对象会复制到幸存1区(又叫S1或者to),随后清理伊甸区和S0区的对象,然后发生交换就是谁空谁是S1区,这次的S1区由于有对象会变成下次的S0区,如果有对象在S0区和S1区来来回回15次就会进入养老区,当养老区对象过多会触发FullGC。

永久代使用的是JVM的堆内存,但在Java8后的元空间不在虚拟机上,而是本机的物理内存。
堆内存的初始值:-Xms 默认为物理内存的1/64
最大分配内存:-Xmx默认是物理内存的1/4
在这里插入图片描述

虚拟机初始内存和最大内存值应该设置一样,避免GC和程序抢夺内存,导致峰值峰谷忽高忽低。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值