JVM
文章平均质量分 70
鱼儿爱丫头
博学慎思,参天尽物。
展开
-
JVM之调优篇
内存泄漏与内存溢出内存溢出指在程序申请内存时,没有足够的内存可以分配,就是OOM,即使垃圾回收之后也不能有足够的空间分配。内存泄漏(Memory Leak)是指在程序运行后,没有释放所占用的内存空间,一次泄漏可能没有什么影响,但是长时间的内存泄漏,堆积到一定程度之后就会内存溢出。比如单例对象,生命周期和应用周期一样长,如果这个单例对象持有一个外部对象的引用的话,那么这个外部对象是不能回收的,则会产生内存泄漏。同时一些资源未关闭,如数据库连接,socket,io流等,使用之后未关闭,最后也会造成内存泄原创 2021-10-31 17:42:09 · 758 阅读 · 0 评论 -
JVM之垃圾收集器
1、Serial收集器新生代的收集器,最早的收集器,单线程的,工作时需要暂停用户线程,会存在卡顿的现象,性能效率不高。是client模式的默认垃圾收集器,对应参数-XX:UseSerialGC2、ParNew收集器新生代的收集器,是Serial的多线程版本,Serial和ParNew可以配合CMS共同工作,在使用CMS的时候会默认使用ParNew作为新生代的收集器。3、Parallel Scavenge收集器新生代收集器,基于复制算法的并行多线程收集器,侧重于达到一个可控吞吐量,如虚拟机运行10.原创 2021-10-30 23:50:27 · 85 阅读 · 0 评论 -
JVM之垃圾回收算法
标记清除算法是最基础的垃圾回收算法,分为标记阶段和清除阶段。标记阶段需要标记出所有需要清除的对象,统一回收掉所有标记的对象,反之也可以通过标记出所有存活的对象,统一回收未标记的对象,可以通过可达性分析算法来标记对象是否存活。清除阶段就对标记的对象进行清除。优点: 实现简单,基于可达性分析算法。缺点: 如果存在大量的对象,那么需要标记和清除需要的时间就越长,执行效率不稳定。同时清除完导致内存空间不连续,导致内存空间碎片过多,导致后面创建较大对象时可能造成无法存储的问题,从而导致不得不再次进行垃圾回收。原创 2021-10-28 21:04:40 · 71 阅读 · 0 评论 -
JVM之常用核心参数
1、-Xms 设置堆内存大小2、-Xmx 设置堆最大内存3、-Xmn 设置堆内存中新生代的内存大小4、-XX:MetaspaceSize 设置元空间内存大小5、-XX:MaxMetaspaceSize 设置元空间最大内存大小6、-Xss 设置每个线程栈内存大小7、-XX:SurvivorRadio 设置Eden区和Survivor区比例,默认8:1:18、-XX:MaxTenuringThreshold 设置年龄阈值9、-XX:UseConcMarkSweepGC 指定使用CMS垃圾收集器原创 2021-10-28 20:32:28 · 198 阅读 · 0 评论 -
JVM之垃圾回收过程
可达性分析算法通过GCRoots作为起始根节点,然后向下搜索,根据引用关系标出哪些是可回收对象,哪些是不可回收对象,GCRoots所走过的路径称为引用链,那么不可达的对象就可以被垃圾回收器回收。可作为GCRoots的对象1、在虚拟机栈中的局部变量所引用的对象可作为GCRoot,譬如各个线程所执行的方法中的局部变量,参数,临时变量等等。2、元空间中静态变量所引用的对象。3、元空间中常量所引用的对象。4、本地方法中的所引用的对象。5、Java虚拟机内部的引用,如class对象,一些常驻的异常对象(原创 2021-10-27 22:01:05 · 856 阅读 · 0 评论 -
JVM之堆内存
对象在堆内存中是如何分配的?1、指针碰撞(Bump the Pointer)内存规整的情况下,内存的表现形式是连续的,分配时指针后移。2、空闲列表(Free List)内存不规整的情况下,选用那种方式分配取决于内存是否规整,而内存是否规整取决于所选的垃圾收集器的空间压缩能力。但是用Serial和ParNew等压缩过程的收集器时,采用的是指针碰撞的分配方式,当使用CMS基于清除算法的收集器的时候,理论上就会空闲列表方式。3、本地线程分配缓冲(Thread Local Allocation Buffe原创 2021-10-26 21:13:35 · 77 阅读 · 0 评论 -
JVM之类加载
类是什么时候被加载的?Java虚拟机规范中是没有指定什么时候加载类的,而是交给具体的虚拟机完成的。HotSpot虚拟机是按需加载,是在需要该类的时候加载这个类的。类的加载过程(生命周期)1、加载classpath、jar包、网络或某个磁盘位置下的类的class二进制字节流读进来,在内存中生成一个代表这个类的class二进制元信息放在元空间2、链接验证验证class文件字节流中包含的信息符合《JVM虚拟机规范》的全部约束要求,来保证虚拟机的安全。准备类常量赋值,类变量赋值的初始值,如int类原创 2021-10-25 21:36:17 · 70 阅读 · 0 评论 -
JVM之内存模型
内存模型虚拟机栈每一个线程开启执行方法的时候都会在虚拟机栈中开辟一块内存空间,每一个线程内方法调用的时候都会开启一块栈帧内内存空间,每一个方法的调用和结束都会伴随着入栈和出栈的过程,一个线程不会同时操作它的多个栈帧,只会执行栈顶的方法。局部变量表变量值的存储空间,主要存储的是方法参数和局部变量,虚拟机通过索引定位的方式使用。操作数栈是一个后入先出栈,是在算数运算或调用其他方法的时候进行参数传递的一块内存空间。在概念模型中,栈帧是独立的,但是通常情况下,操作数栈和局部变量表的一部分是重叠的,因为原创 2021-10-23 19:26:08 · 69 阅读 · 0 评论