![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
他山之途
这个作者很懒,什么都没留下…
展开
-
(一).Java虚拟机--类的加载、连接、初始化
一. java 本身自带工具jvisualvmjconsole二. 类加载,文件从磁盘进入内存在java代码中,类的加载、连接与初始化过程都是在程序运行期间完成的。提供了更大的灵活性,增加了更大可能性。1. 加载:查找并加载类的二进制文件将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象(规范并未...原创 2019-02-28 09:53:21 · 266 阅读 · 0 评论 -
(十四)垃圾收集器
前言Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估。本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比;然后通过G1的内存模型、G1的活动周期,对G1的工作机制进行了介绍;同时还在介绍过程中,描述了可能需要引起注意的优化点。...转载 2019-03-10 23:34:34 · 105 阅读 · 0 评论 -
(十三)垃圾收集器与内存分配策略
1.概述其实当我们在讨论垃圾回收的时候,我们常常要思考垃圾收集(Garbage Collection)需要完成的三件事情:哪些内存需要回收?什么时候回收?如何回收?1.1 哪些内存需要回收Java内存运行时区域的各个部分,其中程序计数器,虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上...原创 2019-03-10 23:08:01 · 145 阅读 · 0 评论 -
(七)Java Class文件格式、常量池项目的类型、表的结构
* u1、u2、u4分别代表1字节、2字节、4字节1.Class文件格式magic:魔数,值为0xcafe baby,表示这是一个可以被虚拟机接收的class文件。很多文件存储标准都使用魔数进行身份识别,比如gif,jpeg。使用魔数而不是文件后缀名的是因为后缀名可以随意改动,使用魔数比较安全。major_version:主版本号,52对应JDK1.8&n...转载 2019-03-04 10:47:25 · 460 阅读 · 0 评论 -
(六)JVM字节码文件
一. 初识字节码文件1. 编写Java测试类package com.java.jvm.bytecode;/** * @author xuweizhi * @date 2019/03/03 12:57 * * */public class ByteCode1 { private int a = 1; public int getA() { re...原创 2019-03-04 10:44:57 · 312 阅读 · 0 评论 -
(十二)JVM内存空间划分与作用详解
1.JVM内存空间虚拟机栈:Stack Frame 栈帧程序计数器本地方法栈:主要处理本地方法堆(Heap):栈中引用指向堆内村对象地址,对象分为两部分对象本身真正拥有的实例数据,对象所属的类型(元数据信息,只拥有一部分),储存在方法区(堆内)。这样方式在垃圾回收的时候,指针的移动的频率相当高。第一种方式:栈中引用不是指向对象本身,堆中对象拥有真正实例数据的指针和元数据指针,实例数据...翻译 2019-03-08 17:10:12 · 433 阅读 · 0 评论 -
(二)SPI解决方案
package com.java.jvm.order;import java.sql.Connection;import java.sql.Driver;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Iterator;import java.util.ServiceLoader;...原创 2019-03-01 15:47:19 · 492 阅读 · 0 评论 -
6.上下文类加载器
1. 方法调用方法调用不同于方法执行,调用阶段主要确定方法调用者的版本,方法调用的目标方法在Class文件都是常量池中的符号引用。而在方法表的code属性中有对应调用该方法的字节码指令。那么在解析阶段,会把一部分符号引用转化成直接引用,那么是哪一部分呢?解析调用能在解析阶段将方法的符号引用转化成直接引用的的方法,必须在方法运行前就确定一个可调用的版本,并且这个版本在运行阶段是不可改变的。就是...转载 2019-02-28 15:12:22 · 195 阅读 · 0 评论 -
7.虚拟机字节码执行引擎
运行时栈帧结构栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息前面说到class文件的方法表集合,每一个方法表后面都可以有一个code属性,存放方法体里面的代码翻译过来的字节码指令,code属性的参数有最大操作数栈深度,局部变量表的大小,这些都是在编译期间确定的。那么在执行引擎运行字节码文件时,调用一个方法就会在虚拟机栈生...转载 2019-02-28 14:45:19 · 105 阅读 · 0 评论 -
5.类加载时机和类加载过程
一. 类的加载时机类从加载到卸载一共经历7个步骤:加载--------验证---------准备----------解析---------初始化----------使用-------------卸载其中验证、准备、解析又叫做连接的过程加载、验证、准备、初始化、卸载这五个步骤顺序是固定的,而解析阶段不一定,解析可以发生在初始化之后,为了支持java语言的运行时绑定。那么什么时候会触发JVM...转载 2019-02-28 14:23:07 · 270 阅读 · 0 评论 -
4.JVM--堆内存分配策略
一. 堆内存分配策略我们都知道,java中对象都放在堆中,那么JVM会如何给新生对象分配内存呢?内存参数回顾:-Xms初始堆内存大小,-Xmx最大堆内存,相等不可扩展,-Xmn堆中新生代对象的内存大小,剩余的就是老年代内存有下面几个原则:(1)优先使用Eden区域新来的要分配内存的对象都属于新生代对象,我们知道,回收新生代对象是复制算法,,分为Eden区和两个survivor区,所以新生...转载 2019-02-28 13:40:46 · 296 阅读 · 0 评论 -
3.JVM--垃圾回收机制
一. 垃圾回收机制1.1 回收堆中的对象JVM会把死去的对象最为即将回收的对象。那么JVM怎么先判断对象的状态是活着还是死去?引用计数算法给每一个对象添加引用计数器,有栈中的引用指向该对象,该对象的引用计数器就加1,引用失效(栈中引用该对象的方法执行完)就减1。若一个对象的引用计数器为0就认为不能在使用,可以回收问题当两个对象循环相互引用,且没有其他对象引用时,引用计数器不为0不能回收...转载 2019-02-28 13:31:37 · 121 阅读 · 0 评论 -
2.JVM--new 关键字底层执行代码的执行过程
一. 在JVM中创建的对象示例放在堆中,那么当JVM执行new语句时,具体是如何操作的呢?(1)首先在方法区的常量池中查看是否有new 后面参数(也就是类名)的符号引用,并检查是否有类的加载信息也就是是否被加载解析和初始化过。如果已经加载过了就不在加载,否则执行类的加载全过程。(2)加载完类后,JVM开始为这个新生对象分配内存,这个时候选用的分配内存的方法取决于堆内存是否是规整的。注意:这种...原创 2019-02-28 10:44:03 · 550 阅读 · 0 评论 -
Java 内存模型(一)——基础
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通...转载 2019-03-26 11:08:37 · 96 阅读 · 0 评论