jvm
Java虚拟机的相关内容,包括类加载机制、jvm的内存区域划分、垃圾收集器等相关知识。
bingaPang
good good study, day day up!
展开
-
深入JVM十一:JVM常见调优工具
这里写目录标题jmap的使用histo参数的使用heap参数的使用堆内存dumpjinfo的使用flags 参数的使用sysprops参数的使用jstat的使用垃圾回收统计堆内存统计年轻代垃圾回收统计新生代内存统计老年代垃圾回收统计老年代内存统计元空间内存统计jstack的使用jstack定位死锁问题使用jstack找出占用cpu最高的线程jstack展示的线程状态JVM运行情况评估jmap的使用jmap主要用来观察运行的JVM进程的内存情况及内存快照生成,这里只要说明其中的几个参数:histo原创 2020-09-16 13:47:51 · 1200 阅读 · 0 评论 -
深入JVM十:JVM中的垃圾收集器
标题Serial收集器ParNew垃圾收集器Parallel Scavenge垃圾收集器CMS垃圾收集器Garbage First(G1)垃圾收集器G1对堆内存的划分G1 垃圾收集器的收集过程GC 垃圾收集器的特征G1垃圾收集器的垃圾收集分类G1垃圾收集器常见JVM参数G1垃圾收集器的建议如何选择垃圾收集器如果说垃圾收集算法是垃圾收集的理论的话,那么垃圾收集器就是垃圾收集理论的实现,接下来来分别了解Serial、ParNew、Parallel Scavenge、CMS、G1等垃圾收集器。Serial收集原创 2020-09-12 21:15:09 · 149 阅读 · 0 评论 -
深入JVM九:对象的回收判断和垃圾收集算法
这里写目录标题如何判断对象可以回收引用计数法可达性分析算法JVM中的常见引用类型finalize最终判定对象是否存活如何判断一个类是无用类垃圾收集算法标记清除算法标记复制算法标记整理算法分代收集理论如何判断对象可以回收堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。 那么判断对象是否死亡该如何判断,有引用计数法和可达性分析两种策略。引用计数法给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1,当引用 失效,计数器就减1,任何时原创 2020-09-10 12:32:13 · 204 阅读 · 0 评论 -
深入JVM八:JVM内存分配机制
标题对象优先在Eden区分配大对象直接进入老年代长期存活的对象进入老年代对象动态年龄判断Minor GC后存活的对象Survivor区放不下老年代空间分配担保机制在了解JVM内存分配的机制之前先来了解一下关于垃圾回收的几个术语:Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。Major GC/Full GC:一般会回收老年代,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上。接下来来了解一下JVM原创 2020-09-09 16:43:16 · 449 阅读 · 0 评论 -
深入JVM七:逃逸分析对对象分配的优化
目录栈上分配标量替换在了解逃逸分析之前我们先来了解一下JVM的即时编译器,即时编译器的工作流程原理如下:Java程序最初运行时通过解析器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁,就会把这些代码认定为“热点代码”,为了提高热点代码的执行效率,在运行时,虚拟机会将这些“热点代码”编译成本地机器吗,并且通过各种手段对代码进行各种的优化。那么在运行期间完成上述功能的就是即时编译器。需要注意的是,这里的编译不是将.java文件编译成字节码文件,而是将字节码编译成中间码或者本地机器码。解析器也是解原创 2020-09-08 12:21:06 · 183 阅读 · 0 评论 -
深入JVM六:对象内存分配和对象内存布局
目录对象创建流程对象内存布局指针压缩对象创建流程在代码中,通过new创建新的对象时会经过如下几个流程:类是否加载当遇到new的字节码指令时,会检查创建实例所属的类是否加载,主要是通过当前类的常量池中的符号引用来确定需要加载的类,如果类未加载则加载指定的类。分配内存从堆内存中为要创建的对象分配内存。内存分配有两种方法:指针碰撞(Bump the Pointer):如果Java的堆内存时规整的,已经分配 的空间在一遍,未分配的空间在另外一遍,中间则使用一个指示器用于划分 已分配空间原创 2020-08-27 15:45:09 · 261 阅读 · 0 评论 -
深入JVM五:各个内存区域OOM示例
这里写目录标题堆内存的溢出栈内存溢出元空间内存溢出在测试JVM每个内存区域的内存溢出异常(OutOfMemoryError)之前,先来了解几个关于指定JVM内存区域的JVM参数:-Xms 和-Xmx : -Xms用于指定JVM运行时堆的初始化空间大小,而-Xmx用于指定JVM运行时堆的最大空间,当两个参数不一样时,在JVM启动时会将空间大小指定为-Xms指定的值,当空间不足时会扩展堆空间,直至堆空间达到-Xmx参数指定的大小。如果不想堆空间在运行时动态扩展,可将-Xms和-Xmx指定大小相同。-X原创 2020-08-26 23:41:53 · 470 阅读 · 1 评论 -
深入JVM四:JVM运行时内存区域剖析
目录JVM运行时区域程序计数器栈(线程)局部变量表和操作数栈方法出口动态链接本地方法栈方法区堆内存JVM运行时区域JVM在执行Java程序的过程中会把他所管理的内存划分成不同的数据区,这些数据区都有各自的的用途,以及创建和销毁的时间,有的区域锁着JVM进程的启动而存在。有些区域则依赖用户线程的启动和结束从而建立和销毁。JVM的运行时数据区和JVM其他组件的之间的关系如下:上图是基于《深入理解Java虚拟机》的图画的,说明了运行时数据区在JVM中的作用。基于对JVM运行时数据区的理解,基于上图的修饰原创 2020-08-21 17:22:45 · 305 阅读 · 0 评论 -
深入JVM三:类加载时机之被动引用
在JVM类加载过程中说明了类在何时出发加载,但是在平常的认知中对一些觉得会触发类加载的情况,其实是不会触发类的加载的,这中情况被称之为被动引用,接下来通过几个实例来看一下被动引用的几个示例。示例1通过子类引用父类的静态变量不会触发子类的初始化:class SuperClass { static { System.out.println("super class init"); } public static int age = 8;}class Sub原创 2020-08-18 22:36:35 · 182 阅读 · 1 评论 -
深入JVM二:类加载器和双亲委派机制
目录类加载器的分类Java中各个类加载器的层次关系自定义类加载器双亲委派机制双亲委派流程双亲委派机制源码剖析打破双亲委派在上面了解了类的加载过程,那么类的加载是如何实现的呢?答案是通过类加载器进行加载的,jvm中类加载也是一个普通的类,但是在jvm中针对不同的jar包或者class由不同的类加载器进行加载,jvm中存在多种类加载器,接下来了解jvm中的各个类加载器。类加载器的分类Java里有如下几种类加载器启动类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库比如 rt.jar、原创 2020-08-10 15:18:19 · 282 阅读 · 0 评论 -
深入JVM一:类加载过程
目录加载类加载的时机验证准备解析初始化首先来看一个示例:public class PrintTest { public static void main(String[] args) { System.out.println("hello"); }}我们通常使用的idea、eclipse和myeclipse等开发工具,启动程序只需触发按钮即可,其最终会调用到JAVA_HOME/bin/java.exe来启动虚拟机,java.exe调用底层的jvm.dll文件创建虚原创 2020-08-07 15:53:42 · 210 阅读 · 0 评论