jvm笔记
xiaoxiao学Java
这个作者很懒,什么都没留下…
展开
-
关于Java对象是否都在堆中分配的理解
Java在jdk1.7之后时默认开启栈上分配的,栈上分配基于逃逸分析以及标量替换来实现。逃逸分析:若是一个对象的创建和消亡都发生在一个方法内,在外界无法发现这样一个对象的存在,那么这个对象就是没有发生逃逸的。若是一个对象赋值给了类中的成员变量,或者return出去了,或者以其他的方法流出到外界了,那么就是发生了逃逸。标量替换:当jvm发现一个对象是没有发生逃逸的时候,而且就会对这个对象进行标量替换,将其拆解为标量,存储到栈中(好处,省去了对象头的消耗,节省了内存空间,也提升了应用程序性能)栈上分配的的原创 2022-03-03 10:08:34 · 328 阅读 · 1 评论 -
对于CMS产生浮动垃圾和G1的一些理解
CMS之所以产生浮动垃圾是因为在并发标记阶段,用户线程和回收线程一块工作,可能会产生之前存活的对象在这段时间消亡了,但是这个已经消亡的对象在初始标记时被标记成了黑色(三色标记法),那么后面就不会对其进行回收,只能等到下一次GC时被回收这里说一下并发标记阶段会产生的两个问题、1、漏标:漏标的意思就是存活的对象没有被标记,之所以会产生这种现象还是并发标记过程中用户现场和回收线程一块执行,可能会发生之前标记过的黑色对象突然和某个白色对象建立起了链接(可以认为是白色对象使用finalize方法复活了)此时因为黑原创 2021-12-12 17:03:29 · 2812 阅读 · 0 评论 -
对于synchronized加锁原理的理解
从底层来讲的话,synchronized加锁的原理就是利用了管程来做到一个线程安全的目的,而Java中管程的实现就是Monitor对象,Monitor这一数据结构其实我认为和AQS是非常相似的,Monitor中维护了一下几个变量owner:指向持有ObjectMonitor对象的线程idWaitSet:存放处于wait状态的线程队列,即调用wait()方法的线程EntryList:存放处于等待锁block状态的线程队列count:约为WaitSet 和 EntryList 的节点数之和cxq: 多原创 2021-11-01 20:09:03 · 157 阅读 · 0 评论 -
对于jdk8之后使用元空间取代永久代的理解
jdk8之后使用元空间代替永久代来作为方法区的实现,那么为什么要这样呢?1、硬件的发展,电脑从32位发展到了64位,在32位电脑中内存的最大容量为2^32bit,也就是4G,此时若是将方法区放在物理内存上势必造成空间紧缺,而64位中除去16位的保留位,剩下的可支持内存仍是非常大的,此时就考虑将方法区的实现放在物理内存了2、Java的发展,比如Spring的启动就需要加载大量的类,若是还将方法区放在堆中,就会对堆的内存管理造成负担...原创 2021-10-30 11:53:55 · 214 阅读 · 0 评论 -
对于JVM虚拟机GC的理解
分代:新生代:minor GC 就是对年轻代收集,会比较频繁,比较适用复制算法老年代:major GC 一般情况下老年代GC都伴随着minor gc,但是也不是一定的(CMS的concurrent collection模式就是只收集老年代)老年代比较适用标记清除/整理算法Mixed GC:收集整个young gen以及部分old gen的GC(只有G1有这个模式)Full GCFull GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm原创 2021-09-06 00:20:05 · 107 阅读 · 0 评论 -
关于JVM方法区的理解
仅用于自己笔记理解《深入理解Java虚拟机 第2版》有这样一句话 --基于jdk1.7方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。在类加载的过程中最终会生成一个java.lang.Class对象,这个对象是我们去访问方法区类型信息的接口,比如我们通过这个对象来访问类的字段、方法、运行时常量池等Class对象是存放在堆区的,不是方法区,这点很多人容易犯错。类的元数据(原创 2021-09-05 23:17:03 · 65 阅读 · 0 评论 -
关于Java对象是否都分配在堆中的一些理解
Java对象是都分配在堆中吗?在曾经这句话是正确的,但是随着技术的不断发展,我们出现了逃逸分析这一个技术,什么是逃逸分析呢?逃逸分析是指当一个对象完全在一个方法里面生老病死,那么我们认为这个对象是没有发生逃逸的,当对象以返回值,或者被其他方法引用了,总之就是当这个对象可以出现在这个方法之外的话,我们认为这个对象是发生了逃逸的。当一个对象没有发生逃逸时,jvm就会考虑采用栈上分配这一技术,在我的理解中,栈上分配就是将这个对象由聚合量分解成多个标量(标量替换),比如Java的原始类型。然后存储在局部变量表原创 2021-08-28 20:03:00 · 165 阅读 · 0 评论