jvm

Why do Java class file versions start from 45?

不想你离开。 提交于 2020-01-24 04:14:05
问题 According to the JVM specification: Oracle's Java Virtual Machine implementation in JDK release 1.0.2 supports class file format versions 45.0 through 45.3 inclusive. JDK releases 1.1.* support class file format versions in the range 45.0 through 45.65535 inclusive. For k ≥ 2, JDK release 1.k supports class file format versions in the range 45.0 through 44+k.0 inclusive. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html I'm wondering, why did they start versioning from 45 and not

JVM梳理

好久不见. 提交于 2020-01-24 03:12:38
一、类加载机制 1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 2、类的生命周期 类的生命周期包括:加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程 加载:查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象 连接:连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用 初始化:为类的静态变量赋予正确的初始值 使用:new出对象程序中使用 卸载:执行垃圾回收 3、类加载器 启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库 扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher

笔记-JVM

徘徊边缘 提交于 2020-01-24 00:00:57
Java Virtual Machine Java虚拟机主要分为五大模块: 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块 。 1. 类装载器子系统 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 1.1 类的加载 指的是将类的.class文件中的二进制数据读入到内存中,将其放在 运行时数据区 的 方法区 内,然后在 堆区 创建一个java.lang.Class对象, 用来封装类在方法区内的数据结构 。类的加载的 最终产品是位于堆区中的Class对象 ,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 1.2 生命周期 整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载共7个阶段 2. 运行时数据区 2.1 程序计数器 可以看作是 当前线程所执行的字节码的行号指示器 。在多线程情况下,轮流切换并分配处理器执行时间,为了线程切换后能恢复到正确的执行位置。 2.2 方法区 线程共享 ;存储已被虚拟机 加载的类信息 , 常量 , 静态变量 , 即时编译器编译后的代码 等数据。 运行时常量池 2.3 Java 虚拟机栈 线程私有 ;描述的是Java方法执行的内存模型,用于存储 栈帧 ,栈帧用于 存储局部变量表

JVM系列之------JVM的内存模型

拟墨画扇 提交于 2020-01-23 23:03:41
深入理解JVM内存模型 Java虚拟机在执行Java程序的过程中,把它所管理里的内存划分了不同的数据类型区域,作为一名开发者,我们需要了解jvm的内存分配机制以及这些不同的数据区域各自的作用。 JVM将内存划分成了以下几个运行时数据区: JVM一共将内存分为了五大数据区域,其中蓝色部分为线程共享的区域,橙色部分为线程私有区域。 ###一、程序计数器 程序计数器是一块较小的空间,记录着当前线程所执行的字节码的行号指示器。我们知道,Java虚拟机的多线程是通过抢占CPU分配的时间片来完成的,那么,当前线程正在执行的时候,就会遇到别的线程抢占了时间片导致当前线程挂起,如果没有程序计数器,当CPU下一次想要再继续执行这个线程的时候,它并不知道这个线程执行到哪里了,所以需要有这么一个计数器来记录它上次执行到哪个位置,因此每个Java虚拟机线程都有其自己的 pc(程序计数器)寄存器,该pc寄存器包含当前正在执行的Java虚拟机指令的地址。 有一点我们要知道,当我们执行的是native方法时,这个计数器为空,因为程序计数器记录的是字节码指令地址,但是native方法是大多是通过C实现并未编译成需要执行的字节码指令所以在计数器中是空的,native 方法是通过调用系统指令来实现的,由原生平台直接执行。 ###二、虚拟机栈 虚拟机栈和程序计数器一样,也是线程私有的

JVM (HotSpot) : Where do all the methods go ? method area ? native method stack?

空扰寡人 提交于 2020-01-23 21:52:27
问题 I am new to JVM (HotSpot), and try to understand the architecture of it and how it works, so my question is that do all the methods (both static and non-static) get translated into byte-code ? and when JVM loads the class files, does it load all the methods into somewhere ? like method area ? or native method stacks ? 回答1: It's dependent on the JVM implementation - different JVMs may choose to handle this in different ways (as long as they conform to the Java spec). So you have no absolute

正确设定idea的java的jre环境和jdk

寵の児 提交于 2020-01-23 21:13:54
安装好jdk后,打通了path,在任意地点javac都ok,但是执行java会报错,百思不得其解,后来发现了jdk和jre的差别之后,解决了这个问题: 首先,jdk是开发工具,需配置系统环境变量和path,但是jre仅仅是运行环境,比如某个下载安装的java程序要运行需要这个环境,所以自动安装,所以自动配置path和系统环境变量。jdk解压缩包里包含了jre目录,里面有同版本的jre运行环境和客户端,在win下运行的还有dll虚拟机文件。 所以,在环境变量设置那里,加了一个键值名为:JRE_HOME的内容,D:\JDK1.8\jdk1.8.0_31\jre 保存之后,可以在任意path下执行java了,ok解决。 附录:(转)关于jdk和jre 大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别: Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢?学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。 Jdk

Out of memory exception in my code

天涯浪子 提交于 2020-01-23 16:50:52
问题 I am running a code for long hours as part of a stress test on an Oracle db and using java version "1.4.2". In a nutshell, what I am doing is : while(true) { Allocating some memory as a blob byte[] data = new byte[1000]; stmt = fConnection.prepareStatement(query); // [compiling an insert query which uses the above blob] stmt.execute(); // I insert this blob-row in the database. stmt.close(); } Now I want to run this test for 8-10 hrs. However apparently after inserting about 15million records

Out of memory exception in my code

岁酱吖の 提交于 2020-01-23 16:50:01
问题 I am running a code for long hours as part of a stress test on an Oracle db and using java version "1.4.2". In a nutshell, what I am doing is : while(true) { Allocating some memory as a blob byte[] data = new byte[1000]; stmt = fConnection.prepareStatement(query); // [compiling an insert query which uses the above blob] stmt.execute(); // I insert this blob-row in the database. stmt.close(); } Now I want to run this test for 8-10 hrs. However apparently after inserting about 15million records

Debugging of a JVM application (Java or Scala) with breakpoints in Gradle and IntelliJ 2016.3.5

我们两清 提交于 2020-01-23 15:35:16
问题 I have a JVM application that I need to debug using breakpoints with a Gradle task (run and test as dependencies) within IntelliJ 2016.3.5. There are various sources on how to accomplish debugging with Gradle and IntelliJ: Debug Gradle plugins with IntelliJ Using Intellij to set breakpoints in gradle project (most helpful one) https://youtrack.jetbrains.com/issue/IDEA-119551 https://youtrack.jetbrains.com/issue/IDEA-86465 https://youtrack.jetbrains.com/issue/IDEA-119494 However, these sources

JVM虚拟机(中)--堆,GC机制

寵の児 提交于 2020-01-23 14:02:18
内容承接上节,上节说到了虚拟机栈,本地方法栈及程序计数器及类的加载等相关内容,这节聊聊上节没提到的元空间,堆及堆上的GC机制,GC的算法将在下节继续说明. java 创建的对象大部分都在堆上存储 ,是GC操作的主体.那么堆在内存如何分配的呢?如下图: 首先堆上分为新生代和老年代,新生代又分为Eden区,From Survivor 区及To Survivor区,新生代上发生的GC叫做Minor GC,老年代发生的GC叫做Major GC或者Full GC. Minor GC速度较快,比较频繁,Major GC/Full GC则速度较慢,是Minor GC 的十分之一以下,一般来说,发生Major GC/Full GC时会伴随至少一次Minor GC. 在谈GC之前,先说说新生代与老年代,新生代中Eden,From Survivor及To Survivor之间的联系.以及触发GC的条件. Eden 区,java生成的对象一开始 大多数 (特例后文会讲)都在Eden区,当Eden区中的对象占用空间越来越大时,会触发Minor GC,此时在Eden区的对象如果是可回收的(下文会对可回收判断逻辑进行解释)则直接回收,而不可回收的部分会被放入From Survivor区. From Survivor区与To Survivor区 ,发送GC时,From Survivor区中的数据