
JVM
文章平均质量分 87
wangdongli_1993
这个作者很懒,什么都没留下…
展开
-
JVM(六)垃圾回收机制---垃圾回收算法和垃圾分类器种类
针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:Partial GC:并不收集整个GC堆的模式 Young GC:只收集young gen的GC Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式 Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式 Full GC:收集...原创 2018-07-24 09:25:37 · 1088 阅读 · 0 评论 -
JVM(十)类加载时机和类加载过程
类的加载时机类从加载到卸载一共经历7个步骤:加载--------验证---------准备----------解析---------初始化----------使用-------------卸载其中验证、准备、解析又叫做连接的过程加载、验证、准备、初始化、卸载这五个步骤顺序是固定的,而解析阶段不一定,解析可以发生在初始化之后,为了支持java语言的运行时绑定。那么什么时候会触发J...原创 2018-08-02 08:33:18 · 1364 阅读 · 0 评论 -
JVM(十四)方法调用
方法调用不同于方法执行,调用阶段主要确定方法调用者的版本,方法调用的目标方法在Class文件都是常量池中的符号引用。而在方法表的code属性中有对应调用该方法的字节码指令。那么在解析阶段,会把一部分符号引用转化成直接引用,那么是哪一部分呢?解析调用能在解析阶段将方法的符号引用转化成直接引用的的方法,必须在方法运行前就确定一个可调用的版本,并且这个版本在运行阶段是不可改变的。就是方法“编译期...原创 2018-08-06 15:27:26 · 858 阅读 · 0 评论 -
JVM(十三)虚拟机字节码执行引擎
执行引擎:输入的字节码文件,输出的执行结果运行时栈帧结构栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息前面说到class文件的方法表集合,每一个方法表后面都可以有一个code属性,存放方法体里面的代码翻译过来的字节码指令,code属性的参数有最大操作数栈深度,局部变量表的大小,这些都是在编译期间确定的。那么在执行...原创 2018-08-05 09:51:07 · 263 阅读 · 0 评论 -
JVM(十二)Java中的常量池
Class文件中的常量池这是一个静态常量池,当Java程序经过编译,生产的class文件中就确定了文件中常量池的内容。class文件的结构上一篇已经讲了。常量池主要存放字面量和符号引用运行时常量池 运行时常量池是方法区的一部分。类加载后把class文件的常量池放入方法区的运行时常量池中,并且存放翻译过来的直接引用。运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性...原创 2018-08-05 07:48:44 · 177 阅读 · 0 评论 -
JVM(十一)基于无符号数和表结构的类文件结构
Java的跨平台性就是因为java编译器(javac)生成了.class文件,可以在任何只要安装了虚拟机就可以执行的字节码文件,java虚拟机没有和任何编程语言绑定,包括java语言,他只和.class二进制文件有关 字节码文件组成(.class)以8位字节为单位的二进制流文件,当遇上需要占用8位字节以上的数据,就分割成若干个8位字节进行存储整个class文件可以看成是一张表,...原创 2018-08-04 19:54:17 · 807 阅读 · 0 评论 -
JVM(五)垃圾回收机制---对象存活判定算法
在JVM中,垃圾回收器作用的主要区域就是堆和方法区(一)回收堆中的对象JVM会把死去的对象最为即将回收的对象。那么JVM怎么先判断对象的状态是活着还是死去?引用计数算法给每一个对象添加引用计数器,有栈中的引用指向该对象,该对象的引用计数器就加1,引用失效(栈中引用该对象的方法执行完)就减1。若一个对象的引用计数器为0就认为不能在使用,可以回收问题当两个对象循环相互引用,且没...原创 2018-07-23 09:52:23 · 283 阅读 · 0 评论 -
JVM(四)jvm内存区域与内存异常
JVM运行时内存区域jvm在运行java程序时,会把它管理的内存划分为五个模块程序计数器程序计数器占JVM内存很小的一部分,主要记录jvm执行当前线程字节码文件的行号指示器,字节码解释器会根据计数器的值执行对应行号的字节码。在多线程的时候,JVM是采用线程轮流切换并分配处理器时间的方式来实现的,那么为了切换后线程能找到正确的执行位置,所以每个线程都需要一个程序计数器。所以程序计数器是每...原创 2018-07-22 12:32:12 · 156 阅读 · 0 评论 -
JVM (二)类加载用的类库
java.lang.ClassLoader 抽象类,根据类名称,找到类的字节码,加载类,生成Class对象,获取类资源如配置文件 引导加载类(bootstrap class loader)用来加载java的核心类库的,使用原生代码来实现的(c++),并不继承自java.lang.ClassLoader 扩展类加载库(extension class loader)...原创 2018-07-10 11:49:57 · 400 阅读 · 0 评论 -
JVM(一)类加载机制
(一)JVM内存结构主要有三大块:堆内存,方法区,栈 堆内存 不连续的内存结构,是JVM管理的最大的内存结构。存放实例对象,是所有线程共享的。是垃圾回收器(gc)处理的主要区域,所以也叫gc堆 方法区 存放代码,常量,类变量,里面包含常量池。一般会说方法区位于堆中。所以也被所有线程共享 栈 物理内存连续的一块区域,是线程独有的,生命周期与线程相同,存放局部变量地址,指向堆,可以访问到堆...原创 2018-07-10 10:02:15 · 268 阅读 · 0 评论 -
JVM(三)jvm中对象的创建的过程
在JVM中创建的对象示例放在堆中,那么当JVM执行new语句时,具体是如何操作的呢?(1)首先在方法区的常量池中查看是否有new 后面参数(也就是类名)的符号引用,并检查是否有类的加载信息也就是是否被加载解析和初始化过。如果已经加载过了就不在加载,否则执行类的加载全过程(2)加载完类后,JVM开始为这个新生对象分配内存,这个时候选用的分配内存的方法取决于堆内存是否是规整的 ...原创 2018-07-22 11:10:16 · 1022 阅读 · 0 评论 -
JVM(九)查看虚拟机状态与故障处理
JDK命令行工具可以监管虚拟机性能,让程序员了解虚拟机运行状态,对出现的故障进行修复一般当虚拟机出现问题我们查看其运行日志,异常堆栈,GC日志,线程快照(threaddump),堆转储快照(heapdump)等一般我们了解的jdk命令行工具就是jdk lib下的java.exe和javac.exe,其实bin目录下也有很多命令行工具主要是监视虚拟机和故障处理的jps命令查看虚拟机当...原创 2018-07-25 09:48:49 · 3142 阅读 · 0 评论 -
JVM(八)堆内存分配策略
我们都知道,java中对象都放在堆中,那么JVM会如何给新生对象分配内存呢?内存参数回顾:-Xms初始堆内存大小,-Xmx最大堆内存,相等不可扩展,-Xmn堆中新生代对象的内存大小,剩余的就是老年代内存有下面几个原则:(1)优先使用Eden区域新来的要分配内存的对象都属于新生代对象,我们知道,回收新生代对象是复制算法,,分为Eden区和两个survivor区,所以新生代对象首先在E...原创 2018-07-24 17:12:36 · 1347 阅读 · 2 评论 -
JVM(七)垃圾回收机制---JVM如何启动垃圾回收器
我们都知道垃圾回收器是JVM自己启动的,我们一般不调用它,可以使用system.gc()调用垃圾回收器,但是也不一定什么时候才会执行在JVM规范中并没有规定内存回收的动作,由gc收集器自己决定,那么JVM如何发起内存回收这个动作呢? 枚举根节点 由第五篇笔记我们知道一般可以作为GC roots的对象一般在方法区和虚拟机栈(局部变量表)中,那么也就是说GC roots一般在全局性性...原创 2018-07-24 10:42:06 · 585 阅读 · 0 评论 -
JVM(十五)深入理解线程上下文类加载器
在复习前面的类加载机制时发现对线程上下文类加载器的概念很模糊,所以今天再来总结一下线程上下文类加载器 我们知道JVM虚拟机采用双亲委派模式来加载类,而且在类加载的整个过程中只有在加载阶段可以别程序员操作,加载器通过类的全限定名在class文件的二进制流中加载类,并创建类的唯一一个class对象,作为类的全局访问点。我们知道为了实现程序的动态性,我们可以自定义类加载器,通过重写findCla...原创 2018-08-23 12:08:38 · 7443 阅读 · 4 评论