JVM虚拟机
文章平均质量分 64
112323
喵俺第一专栏
共同学习,共同进步,提高编程技能。另外,有好多优秀的项目练手哦,详细看第一个专栏,里面有很多可作为课设、毕业的项目,希望自己可以帮助到你哦!
展开
-
黑马JVM总结(三十七)
重量级锁就是我们前面介绍过的Monitor enter。原创 2023-10-17 11:26:38 · 372 阅读 · 0 评论 -
黑马JVM总结(三十六)
cas是配合volatile使用的技术 ,对共享变量的安全性要使用synachonized加锁,但是CAS不加锁,它是使用where(true)的死循环,里面compareAndSwap尝试把结果赋值给共享变量,赋值的同时呢,会把旧值跟共享变量当前的值做一个比较,因为他怕在写入结果的时候,有其他线程把已经把共享变量改了,这两个值是一致的就把结果成功的写入共享变量里去,如果不一致,放回false,重新进入where循环。原创 2023-10-17 10:24:17 · 355 阅读 · 0 评论 -
黑马JVM总结(三十五)
使用maven重新编译:生成两个jar包运行这个jar包:再次执行上述结果:0出现的次数为0了。原创 2023-10-16 22:03:40 · 431 阅读 · 0 评论 -
黑马JVM总结(三十四)
java内存模型是如何保证原子性的呢,它是通过synchroized关键字,来达到这个目的的第一个线程来了进入同步代码块之后,把这个对象加上锁了,线程2来了不能执行,只有等到线程1执行完释放锁之后,线程2才有机会获得锁,保证++ -- 指令作为一个整体来运行的只有有个synchroized关键字的才会有monitor区owner:monitor监视器的所有者,同一个时刻只能有一个线程成为ownerEntryList排队等候区。原创 2023-10-15 12:01:25 · 488 阅读 · 0 评论 -
黑马JVM总结(三十三)
在运行期间java虚拟机会对我们代码做一些优化,时间会变短:字节码反复调用,到达一定的阈值,会启用编译器对自己饿吗编译执行,从0层上升为1层C1C1和C2他俩的区别是解释程度不一样 ,C2执行更特殊的优化逃逸分析回去分析new Object对象会不会在循环外用到,被其他方法所引用,发现创建对象不会被逃逸,逃逸分析后在C2里做了优化后,会把对象的创建的字节码替换掉,干脆不会创建对象了,速度会提升很快关闭逃逸分析后时间没有降到3位数,关闭逃逸分析,它就没有达到c2的编译器编译了。原创 2023-10-14 10:58:47 · 422 阅读 · 0 评论 -
黑马JVM总结(三十二)
使用自定义类加载器加载自定义目录下的class文件使用javap工具查看。原创 2023-10-12 22:43:16 · 1080 阅读 · 0 评论 -
黑马JVM总结(三十一)
启动类加载器-扩展类类加载器-应用程序类加载器双亲委派模式:类加载器,加载类的顺序是先依次请问父级有没有加载,没有加载自己才加载,扩展类加载器在getParent的时候为null 以为Bootstrap(启动类加载器)使用c++写的。原创 2023-10-11 22:03:22 · 696 阅读 · 0 评论 -
黑马JVM总结(三十)
new对象,会触发对象的解析和初始化通过类加载器加载类C,这里只会进行类C的加载并不会导致类C的解析以及初始化,这样加载类C的时候类D也不会解析跟初始化通过jps找到进程id:打开进程工具可以看到类C在虚拟机里使用new 关键字,这样类D也加载了。原创 2023-10-10 23:11:37 · 388 阅读 · 1 评论 -
黑马JVM总结(二十九)
类加载可以分为3个阶段,加载、连接、初始化我们知道java类编译成字节码以后,运行呢需要类加载器把类的字节码加载到方法区中类被加载到方法区,这里用的jdk1.8方法区的实现叫做元空间,类的字节码都会被加载到元空间中,加载的同时在java的堆内存中生成一个java_mirror的镜像,他持有instanceKlass的指针地址 ,当new的对象,通过对象的对象头找到(java_mirror)Person.class类对象,在通过类对象区元空间找到instanceKlass,然后可以到元空间里找对应的方法。原创 2023-10-09 22:00:48 · 901 阅读 · 0 评论 -
黑马JVM总结(二十八)
枚举类。原创 2023-10-08 22:05:32 · 371 阅读 · 0 评论 -
黑马JVM总结(二十七)
synchronized代码块的底层原理,它是给一个对象进行一个加锁操作,它是如何保证如果你出现了synchronized代码块中出现了问题,它需要给这个对象有一个正确的解锁操作呢,加锁解锁是成对出现的。原创 2023-10-06 17:18:43 · 446 阅读 · 0 评论 -
黑马JVM总结(二十六)
下面看一下字节码里面怎么做异常的处理。原创 2023-10-06 11:12:02 · 387 阅读 · 0 评论 -
黑马JVM总结(二十五)
这个是多态调用时方法的查找过程,这个过程还是比较复杂的,需要查找很多步,从细微的效率上不如:invokespecial 和invokestatic,因为它设计到运行期间动态的对它进行查找,当然JVM也会对这个查找做一个进一步优化,有一个缓存,当反复的调用同一个方法达到次数以后,就会从缓存中找到这个方法的字节码地址,就不用经历这么多的查找步骤了多态在运行期间虚拟机可以做一个单态的优化,也可以加快方法的取值速度。原创 2023-09-27 23:24:55 · 596 阅读 · 0 评论 -
黑马JVM总结(二十四)
第一次做加法:把他俩弹出,把结果存入操作数栈。在执行加法:弹出那两个值,把结果存入操作数栈。iload把12读取到操作数栈。原创 2023-09-25 22:08:31 · 455 阅读 · 0 评论 -
黑马JVM总结(二十三)
方法体内有一些字节,对应着将来要由java虚拟机执行方法内的代码,构造方法里5个字节代码,main方法里有9个字节的代码java虚拟机呢内部有一个解释器,这个解释器呢可以识别平台无关的字节码指令,把它们最终解释为机器码,然后执行。原创 2023-09-23 23:07:22 · 239 阅读 · 0 评论 -
黑马JVM总结(二十二)
成员变量信息类字节码里的一些简单表示:原创 2023-09-23 21:53:12 · 166 阅读 · 0 评论 -
黑马JVM总结(二十一)
魔术:所有文件都由自己的一个类型 java文件用了4个字节来表示。0a十六进制转换为十进制为10查上面的那个表:代表方法引用的信息。u4代表字节数:前4个字节。原创 2023-09-23 18:29:39 · 126 阅读 · 0 评论 -
黑马JVM总结(二十)
CMS是低响应时间的,并发的一个垃圾回收器 ,有这样一个缺点,因为在垃圾回收的同时,其他的用户线程也在运行,就会产生新的垃圾这个新的垃圾称为浮动垃圾,如果浮动垃圾产生了又导致内存不足问题就大了就会造成CMSD并发失败,CMS的垃圾回收器就不能正常工作了,就会退化为串行SerialOld的老年代垃圾回收器,效率就低了。原创 2023-09-23 11:44:48 · 173 阅读 · 0 评论 -
黑马JVM总结(十九)
通过官网查看查看JVM的参数:可以使用java命令查看当前环境下的虚拟机参数:学会使用一些工具如前面学的jmap ,jconsole等等工具。原创 2023-09-23 00:33:01 · 539 阅读 · 0 评论 -
黑马JVM总结(十八)
SerialGC:串行的,ParallelGC:并行的 ,CMS和G1都是并发的这几种垃圾回收器的新生代回收机制时相同的,SerialGC和ParalledGC:老年代内存不足触发的叫FullGCCMS和G1老年代的内存不足分两种情况,以G1垃圾回收器为例:它本来是没有Full GC的,但是:G1垃圾回收器内存不足时有一个阈值,当你的老年代内存跟整个堆内存占比达到45%以上的时候 触发并发标记阶段和混合收集的阶段,这两个阶段,当你的回收速度高于新的用户线程产生的垃圾的时候,回收的速度快于产生的垃圾速原创 2023-09-21 17:01:40 · 399 阅读 · 0 评论 -
黑马JVM总结(十七)
下面介绍一种Grabage one的垃圾回收器,在jdk9的时候称为默认的回收器,废除了之前的CMS垃圾回收器,它的内部也是并发的垃圾回收器我们可以想到堆内存过大,肯定会导致回收速度变慢,因为要涉及到对象的复制、标记,内存过大,对速度会产生影响,划分为小的区域进行管理,可以进行一些优化,标记和复制的速度在jdk1.8还不是默认的额需要使用参数启动:-XX:+Use1GC-XX:G1HeapReginSize:设置区域的大小-XX:MaxGCPauseMillis:默认暂停目标。原创 2023-09-19 17:21:04 · 622 阅读 · 0 评论 -
黑马JVM总结(十六)
垃圾回收器分为以下:吞吐量:垃圾回收时间占程序回收时间的一个占比,占比越低,吞吐量越高。原创 2023-09-19 12:22:42 · 484 阅读 · 0 评论 -
黑马JVM总结(十五)
下面通过一个案例去读懂垃圾回收的一个过程,学会读懂垃圾回收的日志-XX:UseSerialGC:是一个垃圾回收器,jdk8下默认的垃圾回收器不是它,改为UseSerialGC它的幸存区的比例才不会调整设置虚拟机参数:没有任何代码是堆的占用情况:没有任何对象,20兆空间是足够用的,没有打印任何的GC信息,只打印了程序结束后堆的运行情况:新生代:总共9兆多,因为8兆划分非伊甸园,1兆幸存区From,1兆幸存区To ,幸存区To始终空着,所以计算空间时去掉了总共9兆多。原创 2023-09-18 17:06:36 · 639 阅读 · 0 评论 -
黑马JVM总结(十四)
Java虚拟机都是结合前面几种算法,让他们协同工作,具体实现是虚拟机里面一个叫做分代的垃圾回收机制,把我们堆内存大的区域划分为两块新生代、老年代新生代有划分为伊甸园、幸存区Form、幸存区To为什么要这样区域划分呢?原创 2023-09-18 15:06:55 · 527 阅读 · 0 评论 -
黑马JVM总结(十三)
这三种算法在实际的JVM垃圾回收机制中,都会根据不同的情况来采用不会说只用其中一种算法,会结合多种算法实现垃圾回收,下面我们会讲一种分代垃圾回收机制。原创 2023-09-18 11:23:01 · 417 阅读 · 0 评论 -
黑马JVM总结(十二)
达到这个目的,当没有强引用我的这个对象时,对象会由虚拟机帮我们创建它对应的终结器引用,当这个对象A4被垃圾回收时把终结器引用也加入引用队列,再由一个优先级很低的一个线程在某个时机去这个引用队列是不是有终结器引用,有的话会找到我们要作为垃圾回收的这个对象并且调用它的finallize方法,等调用完了,等下一次垃圾回收时就可以回收掉了。为什么做这样的一个处理呢?当软引用的对象被回收掉之后软引用自身也是一个对象,在创爱时分配了一个引用队列,当它所引用的对象被回收时软引用就会进入这个队列,弱引用也是如此。原创 2023-09-17 22:43:00 · 451 阅读 · 1 评论 -
黑马JVM总结(十一)
前面我们学了堆,里面有一个垃圾回收的机制。原创 2023-09-17 12:11:45 · 436 阅读 · 0 评论 -
黑马JVM总结(十)
下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高。原创 2023-09-16 21:11:03 · 547 阅读 · 0 评论 -
黑马JVM总结(九)
我们知道StringTable底层是一个哈希表,哈希表的性能是跟它的大小相关的,如果哈希表这个桶的个数比较多,元素相对分散,哈希碰撞的几率就会减少,查找的速度较快,反之桶的个数较少,碰撞的几率增高,导致我的链表较长,查找的效率受到影响调优呢主要是调整HashTable桶的个数:时间还是挺快的0.4秒 提前设置了参数-XX:StringTableSize=200000StaringTable的统计信息 桶个数调整到20000w,48w个单词平均分散到20w桶里面平均每个桶2个单词,读取的效率较快的如果去掉参原创 2023-09-15 23:31:32 · 338 阅读 · 0 评论 -
黑马JVM总结(八)
因为永久代的内存效率很低,永久代是在Full GC的时候才会触发永久代的垃圾回收,Full GC只有等到老年代的空间不足时才会触发,触发的时机比较晚导致StringTable的回收效率不高。,基于这个缺点,把它转到堆里面,在堆里面只需要Minor GC就可以触发垃圾回收,一些常量池中的用不到的字符串对相关就可以垃圾回收,大大减轻了字符串对内存的占用。上面的代码我们什么都没有做,但是有数据,java程序在运行时类名,方法名,这些数据也是以字符串常量的形式表示的他们也存在串池中已经有那么多字符串对象了。原创 2023-09-14 23:19:59 · 707 阅读 · 0 评论 -
黑马JVM总结(七)
a”+“b”对应#4:是去常量池中找ab的这个符号astore 5:是把这个存入编号为5的局部变量“ab”对应的指令 #4,跟“a”+“b”对应#4下面弄是一样的在执行s3=“ab”这行个代码时,去常量池中找ab这个对象,发现串池中没有ab这个对象,创建放入串池,执行到s5=“a”+“b”这行代码时所以astore到 3的变量和astore到 5 的变量都是串池中的ab字符串对象。原创 2023-09-13 22:54:56 · 344 阅读 · 0 评论 -
黑马JVM总结(六)
方法区的组成中都由一个叫做运行时常量池的部分,内部包含一个叫做StringTable的东西反编译二进制字节码:类的基本信息:常量池:方法定义:构造方法main方法 :方法中有一些指令,通过指令 #2去常量池中找这个静态指令常量池:#2它是要找java/lang/System类下的out变量,类型是java/io/PrintStreamldc:通过常量池总用:就是给我们这些指令提供一些常量符号根据这个常量符号去一查找的方式去找到它。原创 2023-09-13 18:24:28 · 490 阅读 · 0 评论 -
黑马JVM总结(五)
所以我们用Spring和mybatis的时候经常会产生大量的在运行期间生成的类,容易产生永久代的内存溢出的,1.8以后呢使用元空间相对充裕很多,并且垃圾回收机制也是由元空间自行管理了,就不会像永久代一样垃圾回收效率很低,经常由于垃圾回收效率低而导致内存溢出。它是所有java虚拟机 线程共享的区,存储着跟类的结构相关的信息,类的成员变量,方法数据,成员方法,构造器方法,特殊方法(类的构造器)方法区在虚拟机启动时被创建,方法区逻辑上是堆的组成部分,但是不同的JVM厂商实现是不一样的:Oracle的。原创 2023-09-11 22:37:22 · 834 阅读 · 0 评论 -
黑马JVM总结(四)
Java虚拟机调用本地方法时,给本地方法提供的一个内存空间,本地方法它是指哪些不是由java代码编写的方法java代码有一定限制,它有时候不能直接跟操作系统底层打交道,需要用c和c++语言编写的本地方法来针对与于操作系统底层的API打交道,我们的java代码间接的通过本地方法调用底层的功能,那这些本地方法运行的时候使用的内存叫做本地方法栈本地方法是非常多的。原创 2023-09-10 16:20:28 · 533 阅读 · 0 评论 -
黑马JVM总结(三)
方法的递归调用,没有设置正确的结束条件,栈会有用完的一天,导致栈内存溢出可以修改栈的大小:再次运行:减少了次数案例二:两个类的循环应用问题,导致Json解析时会出现解决:员工不在关联部门了,转换时忽略这个属性转换,打破这个循环引用依赖。原创 2023-09-10 10:39:23 · 717 阅读 · 0 评论 -
黑马JVM总结(二)
栈帧对应一次方法的调用,线程是要执行代码的,这些代码都是由一个个方法组成,线程运行的时候每个方法需要的内存叫做一个栈帧。原创 2023-09-09 17:53:47 · 437 阅读 · 1 评论 -
黑马JVM总结(一)
JVM是java的运行环境,我们写了一个HelloWorld.java源代码,经过javac编译成了class字节码,这个class字节码使用一个java程序加载到虚拟机里就可以运行了Java语言是跨平台的,它是在那个层面上实现的呢?怎么保证编写的java类既能Windows又能在Linux上运行呢,关键是我们的JVM,JVM屏蔽了我们的字节码底层的操作系统之间的差异,对外提供了一个一致的运行环境,JVM就能用解释的方法来执行二进制的字节码,来达到平台的无关性。原创 2023-09-09 12:52:01 · 382 阅读 · 0 评论 -
深入理解JVM虚拟机(六)
没有触发java中的垃圾回收,byteBuffer对象虽然没有人引用它,,但是由于内存还充足,ByteBuffer还在存活着,它所对应的那块直接内存也没有被回收掉,当设置了这个参数,对直接内存有影响的,ByteBuffer只能等到真正的垃圾回收时才能被清理,从而对应的直接内存才能释放,这样就导致了对应的直接内存占用较大,尝尝得不到释放。直接内存不受JVM的管理,直接内存所分配的内存会不会被正确回收,底层是怎么实现的呢?直接内存并不属于java虚拟机的内存管理,而是属于系统内存,是操作系统的内存。原创 2023-03-22 12:04:01 · 269 阅读 · 0 评论 -
深入理解JVM虚拟机(五)
永久代内存回收效率很低,永久代在复制gc的时候 ,才会触发永久代的垃圾回收,复制jc只有等到老年代的空间不足才会触发,触发的时机较慢,才会导致StringTable的回收效率不高,StringTable用的非常的频繁,我们java程序中大量的字符串、常量对象都会分配到StringTable中,如果StringTable的回收效率不高就会占用大量的内存,容易导致永久代的内存不足,这就是它的缺点。如果98%的时间用到垃圾回收上,只有2%的堆空间回收了,会报下面的异常,如果想要报堆空间不足的异常需要加参数。原创 2023-03-21 23:45:40 · 178 阅读 · 0 评论 -
深入理解JVM虚拟机(四)
他去常量池找#4的ab符号,这时ab在串池中已经有了,他不会创建新的,它会用已有的ab对象,所以s3和s5变量都是存在串池的ab对象。它先从1-0的数字加入串池中,执行一行代码,把没有的数字放入串池,后面在加入,不会再创建新的字串对象了。s3是在串池当中的,s4是new出来的字符串,是存在堆当中 的,所以不是一个对象。串池:会把字符串对象在串池中查找是否有这个对象,没有把它放进去。学习运行时常量池中重要组成部分。把a对象存入局部变量。原创 2023-03-21 18:07:02 · 257 阅读 · 0 评论