jvm

java JVM内存相关

半世苍凉 提交于 2020-04-06 00:26:24
大家平时知道的java的内存分为栈和堆,一般new出来的对象都是在堆上的。这里用的是一般,也就是说在有些情况下可能不是分配在堆上。在一定的情况下对象也是可以分配到栈上的。首先看一下java JVM运行时的数据区: 图中的 方法区 和 堆 是所有线程共享的, 虚拟栈 , 本地方法栈 和 程序计数器 是线程私有的。也就是说虚拟栈,本地方法和程序计数器是线程隔离的。程序计数器是唯一不会出现oom的部分。 程序计数器 可以看成当前线程执行的字节码的行号暗示器。 虚拟机栈 和线程的生命周期是一样的,当线程执行的时候会创建一个栈帧,用于存放当前线程的方法出口,局部变量表,操作数栈,动态连接等信息。 本地方法栈 用于调用native方法使用。 堆 是所有线程共享的部分,用于存储创建的对象。 方法区 和堆一样都是所有线程共享的,方法区主要用于存放虚拟机加载的类的信息,常量,静态常量等信息。 除了运行时数据区外还有一部分内存是不受虚拟机管理的部分,这一部分就是直接内存,直接内存是直接在物理的memory分配,我们经常使用的 ByteBuffer. allocateDirect 就是直接在物理内存上分配的。但是在虚拟机里面会有这部分内存的引用,以便对这一部分内存进行管理。 本文内容参考《深入理解JAVA虚拟机》 来源: oschina 链接: https://my.oschina.net/u

JVM 系列 : 3. 类加载机制

断了今生、忘了曾经 提交于 2020-04-05 21:53:30
上一篇文章介绍了class文件结构,在class文件中存储的各类数据。在这篇文章主要介绍 JVM(Java Virtual Machine) 是如何将class文件加载到内存中的,简言之”类加载机制“ 类加载机制概述 虚拟机将class文件中数据加载到内存,并对其进行验证、解析和初始化,最终形成虚拟机可以使用的Java类型的过程,称之为“类加载机制”,在这里主要将加载过程分为“加载”、“验证”、“准备”、“解析”、“初始化”五个阶段。 类加载的过程 1. 加载 将Class文件加载到方法区中。 2. 验证 文件格式验证 验证字节流是否符合Class文件格式的规范,及能否被当前虚拟机处理。主要验证如下: □ 是否以魔数开头(0xCAFEBABE) □ 主版本号、次版本号是否在当前虚拟机处理范围内 □ 常量池中是否有不被支持的常量类型 。。。。。 元数据验证 对字节码数据进行语义分析,主要验证如下: □ 此类是否有父类 □ 此类是否继承了不允许被继承的类 □ 如果不是抽象类,是否实现了父类的或接口要求实现的所有方法 。。。。。 字节码验证 验证类的方法体是否合法、符合逻辑。 符号引用验证 对常量池中各类符号引用进行匹配性分析。 此过程发生在解析阶段中进行。 3. 准备 为类变量设置零值 4. 解析 将常量池中符号引用替换为直接引用。主要包括以下: □ 类或接口解析 □ 字段解析 □

final, finally, finalize的区别

元气小坏坏 提交于 2020-04-05 15:01:46
(1)final:修饰符。 A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。 B).如果将变量或者方法声明为final,可以保证它们在使用中不被改变。 C).被声明final的方法只能使用,不能重写。 (2)finally:异常处理机制的一部分 A).finally结构使代码总会执行,而不管是否有异常。 B).使用finally常用于释放资源。 (3)finalize:Java中垃圾回收器执行的方法。 A).它是一个方法,属于java.lang.Object类。 B).在垃圾收集器执行的时候会调用的此方法,进行对象的回收,但在调用垃圾回收gc()后,并不能立即执行回收,JVM根据算法定时执行。 来源: oschina 链接: https://my.oschina.net/ilovejava/blog/3217265

JDK/bin下工具列表说明

蹲街弑〆低调 提交于 2020-04-04 17:23:07
JDK/bin下工具列表说明 appletviewer.exe:一种执行HTML文件上的Java小程序类的Java浏览器 apt.exe:注解处理工具(Annotation Processing Tool), SolarisTM 操作系统和 Linux上用于处理注释的工具 extcheck.exe:扩展检测工具,检测目标 jar 文件与当前安装方式扩展jar 文件间的版本冲突 HtmlConverter.exe:Java(TM) 插件 HTML 转换器是一种实用程序,可用于将任一包含小程序的 HTML 页面,转换为使用 Java(TM)插件的格式 idlj.exe:IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定,IDL意即接口定义语言(Interface Definition Language) jabswitch.exe:Java访问桥开关(JavaAccess Bridge switch),用于启用/禁用Java访问桥。Java访问桥内置于Java 7 Update 6及以上版本,主要为Windows系统平台提供一套访问Java应用的API jar.exe:文件管理工具,是个java应用程序,可将多个文件合并为单个JAR归档文件 jarsigner.exe:密钥签名工具,为 Java 归档 (JAR) 文件产生签名

JDK自带工具介绍

你说的曾经没有我的故事 提交于 2020-04-04 17:20:39
JDK工具一览表 工具名称 功能描述 appletviewer.exe 用于运行并浏览applet小程序。 apt.exe 注解处理工具(Annotation Processing Tool),主要用于注解处理。 extcheck.exe 扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。 idlj.exe IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。IDL意即接口定义语言(Interface Definition Language)。 jabswitch.exe Java访问桥开关(Java Access Bridge switch),用于启用/禁用Java访问桥。Java访问桥内置于Java 7 Update 6及以上版本,主要为Windows系统平台提供一套访问Java应用的API。 jar.exe jar文件管理工具,主要用于打包压缩、解压jar文件。 jarsigner.exe jar密匙签名工具。 java.exe Java运行工具,用于运行.class字节码文件或.jar文件。 javac.exe Java编译工具(Java Compiler),用于编译Java源代码文件。 javadoc.exe Java文档工具

JVM系列十(Class 文件结构).

不想你离开。 提交于 2020-04-03 19:39:33
一、Class 文件结构 JDK 的版本号已经到 14 了,相对于语言、API 以及 Java 技术体系中其他方面的变化,Class 文件结构一直处于比较稳定的状态,Class 文件的主体结构、字节码指令的语义和数量几乎没有出现过变动。 Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 根据 Java 虚拟机规范的规定,Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表: 无符号数:以 u1、u2、u4、u8 来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串值。 表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性的以“_info” 结尾,用于描述有层次关系的复合结构的数据,整个 Class 文件本质上就是一张表。 下面是 Class 文件格式: 类型 名称 数量 描述 u4 magic 1 表示这个文件是否为一个能被虚拟机接受的 Class 文件 u2 minor_version 1 次版本号 u2 major_version 1 主版本号

浅谈JDK、JRE、JVM区别与联系

好久不见. 提交于 2020-04-03 15:01:23
浅谈JDK、JRE、JVM区别与联系 摘要 JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。 一、JDK JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。有这样一个关系,JDK包含JRE,而JRE包 含JVM。 bin:最主要的是编译器(javac.exe) include:java和JVM交互用的头文件 lib:类库 jre:java运行环境 1234 (注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的) 总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。 二

JVM虚拟机

a 夏天 提交于 2020-04-01 02:05:52
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用,如图所示JDK、JRE、JVM关系图: 如下为JVM虚拟机主要由堆、栈、本地方法栈、方法区组成,物理架构如图: 1)堆 所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示: 新生代,新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例 旧生代,用于存放新生代中经过多次垃圾回收仍然存活的对象 持久带,(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent

深入理解jvm jdk1,7(17)

你说的曾经没有我的故事 提交于 2020-03-31 08:59:06
垃圾收集算法 复制算法: 为了解决效率问题,一种称为“复制”的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也不用考虑内存碎片等复杂情况,只要一定堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,未免太高了一点。复制算法的执行过程如下图: 现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一个Survivor。当回收时,将Eden和Survivor钟还存活这的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”。当然,98%的对象可回收只是一般的场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时

深入理解jvm jdk1,7(11)

旧时模样 提交于 2020-03-31 08:58:02
OutOfMemoryError异常:在java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能 Java堆溢出: Java堆用于存储对象实例,只要不断的创建对象,并且保证GCRoots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。 public class Test { /** * -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError * * @param args */ public static void main(String[] args) { List<OOMObject> list = new ArrayList<>(); List<OOMObject1> list1 = new ArrayList<>(); int i = 0; while (i<10) { list1.add(new OOMObject1()); i++; } while (true) { list.add(new OOMObject()); } } static class OOMObject { } static class OOMObject1 { }} -Xms20M:堆的最小空间 -Xmx20M:堆的最大空间