八股--JVM

第二点有点乱,但是我尽量根据自己的思路去理清楚了,今天还算是有收获~ 

1、Java中Synchronized的具体用法是什么?

在多线程环境中,当两个或多个线程同时尝试更新可变共享数据是,出现竞争条件,java提供了一种通过同步机制来避免竞争条件的发生。也就是通过Synchronized标记一个代码块,在任何给定时间只允许一个线程执行。

可以用在:

· 实例方法(在方法声明中添加Sychronized即可,实例方法在拥有该方法的类的实例上同步,也就是每个类的实例只能有一个线程可以执行此方法)

· 静态方法 (与该类的class对象同步,每个类只能在一个静态同步方法内执行一个线程)

· 代码块(方法的某些指令),Synchonized 括号⾥配置的对象。

2、堆(垃圾分代)

java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。作用是存储对象实例,几乎所有的对象实例以及数组都是在这里分布内存。

java堆也是垃圾收集器管理的主要区域,所有也叫作GC堆(Garbage Collected Head)。从垃圾回收的角度,因为现在收集器都采用分代垃圾收集算法,所以java堆还可以分成新生代和老年代,持久代。(划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存的分配以及回收)

1)新生代:新生代可以划为三个区域:1个Eden Space和2个Suvivor Space。新生代主要是保存新出现的对象,内存大小会较小,垃圾回收会较频繁

2)老年代:老年代主要存放JVM认为生命周期比较长的对象(经过几次的年轻代的垃圾回收后仍然存在),老年代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边,也就是内存整理)

3)持久代:存放被虚拟机加载的类信息,静态变量,常量等数据

为什么新生代要分Eden和两个 Survivor 区域?

如果没有Survivor,Eden每次进行Minor GC,存活的对象就会送到老年代。

设置两个Survivor的最大好处就是解决了碎片化,因为新建的对象被存放在Eden中,经历了一次Minor GC,Eden中的存活对象就会被移动到第一快速survivor,Eden被清空;等下次Eden装满了,再出发Minor GC ,Eden和第一块Survivor的存活对象就会被复制送入到第二块Survivor,这种算法保证了第二块s的存活对象占用连续的内存空间,避免了碎片化的发生。


GC垃圾回收主要发生在Eden区和养老区,内存满了就报OOM(堆内存不够)

对象创建的过程

· 类加载检查,在虚拟机遇到一条new指令之后,将先去检查这个类是否被加载过,如果没有,则通过类加载器去进行相应的加载过程。

· 在类加载器检查通过后,就为新生对象去分配内存,为对象分配内存的任务就相当于把一块确定大小的内存从java堆中划分出来。

· 初始化零值,将分配到的内存空间都初始化为零值,保证了对象的实例字段在不赋予初值的情况下就可以直接使用。

· 设置对象头,初始化零值之后要对对象进行必要的设置:对象是哪个类的实例,对象的哈希吗,对象的GC分代等,这些信息存放到对象头中

· 执行init方法,把对象按照程序员的意愿进行初始化,把字段给赋值。

分配内存的方式有Java堆是否规整决定,主要有"指针碰撞“和”空闲列表“两种。

· 指针碰撞:

适用情况:堆内存规整(没有内存碎片)的情况

原理:用过的内存全部整合到一边,没有用过的内存放到另外一边,中间有个分解指针,分配内存就是把这个指针向着没有分配的方向移动对象内存大小即可

· 空闲列表

适用情况:堆内存不规则的情况下

原理:虚拟机会维护一个列表,列表中记录哪些内存块是可用的,根据对象内存大小分配一块合适的内存块给对象实例,最后更新列表

内存分配并发问题

在创建对象的过程中会出现线程安全的问题,虚拟机采用了两种方式来保证线程安全。

· CAS+失败重试,CAS是乐观锁的一种实现方式,就是每次假设没有冲突去执行某项操作,如果因为冲突失败就重试直到成功为止。虚拟机采用CAS配上失败重试的方式保证更新操作的原子性

· TLAB:为每个线程预先在Eden分配一块内存,JVM在给对象分配内存的时候,首先在TLAB分配,当对象大于TLAB中的剩余内存或内存已经用尽时,再采用上述的CAS进行内存分配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值