Skip to content

Commit 50f59d5

Browse files
committed
更新JVM原理
1 parent 12123d8 commit 50f59d5

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

MD/Java基础-JVM原理.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ JVM本身是介于JAVA编译器和操作系统之间的程序,这个程序提
2424
* 直接内存区域是全局共享的内存区域。
2525

2626
### Java对象不都是分配在堆上
27-
废话,还有线程使用的虚拟机栈上的啊,在方法体中声明的变量以及创建的对象,将直接从该线程所使用的栈中分配空间。
27+
还能分配在栈上
2828
#### 逃逸分析
2929
逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,即成为逃逸。
3030

3131
逃逸分析可以分析出某个对象是否永远只在某个方法、线程的范围内,并没有“逃逸”出这个范围,逃逸分析的一个结果就是对于某些未逃逸对象可以直接在栈上分配,由于该对象一定是局部的,所以栈上分配不会有问题。
3232

33-
#### TLAB
33+
### TLAB
3434
JVM在内存新生代Eden Space中开辟了一小块线程私有的区域TLAB(Thread-local allocation buffer)。在Java程序中很多对象都是小对象且用过即丢,它们不存在线程共享也适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。
3535
也就是说,Java中每个线程都会有自己的缓冲区称作TLAB,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。
3636

0 commit comments

Comments
 (0)