JavaVolatile关键字和瘫痪原因

Java的volatile关键字用于标记一个变量“应当存储在主存”,更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取,每次写入一个volatile变量,应该写到主存中,而不是仅仅写到CPU缓存。

实际上,从Java5开始,volatile关键字除了保证volatile变量从主存读写外,还提供了更多的保障,我将在后面的章节中进行说明。

变量可见性问题。

Java的volatile关键字能保证变量修改后,对各个线程是可见的,这个听起来有些抽象,下面就详细说明。

在一个多线程的应用中,线程在操作非volatile变量时,出于性能考虑,每个线程可能会将变量从主存拷贝到CPU缓存中,如果你的计算机有多个CPU,每个线程可能会在不同的CPU中长春Java培训运行,这意味着,每个线程都有可能会把变量拷贝到各自CPU的缓存中。

对于非volatile变量,JVM并不保证会从主存中读取数据到CPU缓存,或者将CPU缓存中的数据写到主存中,这会引起一些问题,在后面的章节中,我会来解释这些问题。

如果只有线程1修改了(自增)counter变量,而线程1和线程2两个线程都会在某些时刻读取counter变量。

如果counter变量没有声明成volatile,则counter的值不保证会从CPU缓存写回到主存中,也就是说,CPU缓存和主存中的counter变量值并不一致。

这就是“可见性”问题,线程看不到变量最新的值,因为其他线程还没有将变量值从CPU缓存写回到主存,一个线程中的修改对另外的线程是不可见的。

长春Java培训哪家好volatile可见性保证。

Java的volatile关键字就是设计用来解决变量可见性问题,将counter变量声明为volatile,则在写入counter变量时,也会同时将变量值写入到主存中,同样的,在读取counter变量值时,也会直接从主存中读取。

一,内存回收一直是java的痛点。

用Java无法做出类似Redis这样的产品,java的内存回收机制使我们在编写代码时不需要关注对象的回收,同时加大了内存回收的消耗,标记复制需要做内存拷贝,标记清除算法则需要stoptheworld,所以我们在使用缓存的时候,量稍微大一些就需要借助类似Redis这样的中间件帮我们处理了,作为Javaer,我们享受了自动内存回收的安逸,同时也需要多了解下内存优化的方法。

二,为什么fgc停不下来长春Java培训机构了。

1.什么情况下会gc。

为了了解我们的系统为什么会不停fgc,我们需要先了解一下系统什么情况下会gc,在jvm层面,当我们new一个对象的时候,jvm会先在堆区分配对象需要的内存,这个时候如果内存不够的话,就需要gc了,gc的返回结果就是对象的空间地址,jvm会先进行ygc,也就是我们通常说的标记复制,如果ygc之后依然申请不到空间,就会进行fgc了,同理,如果fgc之后依然没有足够的空间,就会循环的进行fgc,直到申请到足够的空间。

2.导致不停的fgc的原因。

如上文所讲,fgc有可能发生在你的每一行代码,如果fgc之后依然没有足够的空间,就会不停的fgc,直到申请到足够的空间,同时JVM会限制在抛出OutOfMemory错误之前在GC中花费的VM时间的比例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注