jvm

jvm垃圾回收策略

南楼画角 提交于 2020-02-09 00:30:42
java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已经介绍了CLR中GC的对象回收方式,是基于代的内存回收策略,其实在java中,JVM的对象回收策略也是基于分代的思想。这样做的目的就是为了提高垃圾 回收的性能,避免对堆中的所有对象进行检查时所带来的程序的响应的延迟,因为jvm执行GC时,会stop the word,即终止其它线程的运行,等回收完毕,才恢复其它线程的操作。基于分代的思想是:jvm在每一次执行垃圾收集器时,只是对一小部分内存 对象引用进行检查,这一小部分对象的生命周期也更短,从而加快了垃圾收集的性能。下面我们将来介绍java中的基于代的内存回收算法的基本策略: 一、jvm堆内存的分代划分 在基于分代的内存回收策略中,堆空间通常都被划分为3个代,年轻代,年老代(或者tenured代),永久代。在年轻代中又被划分了三个小的区域,分别为:Eden(伊甸)区,S0区(survivor 0),S1区(survivor 1),如下图所示: 其中,新的对象总被分配到年经代中,当年轻代空间被填满时,这时需要执行一次垃圾回收,即执行 minor GC,回收不再被引用的对象,并同时提升幸存的对象其年龄,年经代中的幸存对象都有年龄标识字段,一旦其达到一定的阈值,则仍然幸存的对象将被提升到老年代空间中。 老年代的空间用于存放长时间幸存的对象,即生命周期较长的对象

JVM(二)JVM内存布局

痞子三分冷 提交于 2020-02-09 00:16:09
这几天我再次阅读了《深入理解Java虚拟机》之第二章“Java内存区域与内存溢出异常”,同时也参考了一些网上的资料,现在把自己的一些认识和体会记录一下。 (本文为博主原创文章,转载请注明出处) 一、概述 在网上看到很多的各种文章来写Java内存布局/Java内存模型(JMM)/Java内存分配和回收等。初学者,往往容易被搞混淆,这些东西到底都是些啥?讲的是不是同一个东西?如果不是同一个东西,那它们之间又有什么区别和联系?说句实话,笔者在看到这些文章和概念时,一样是有这些疑问的。下面我来说说我的理解,如果有人觉得有异议或者不对的地方,欢迎讨论和指出,谢谢! 1.1 Java内存布局 我认为这是一个静态的概念, 即JVM在概念和作用上对其管理的内存进行划分。如整体上来看,JVM的内存分为堆区和非堆区,而非堆区又包括了方法区、JVM栈、本地方法栈、程序计数器等。直接上图: 图1.1 1.2 Java内存模型(JMM) 这个讲的是Java多线程的情况下,多线程之间的内存通信模型。即如果多个线程存在共享同一块内存的情况下,JVM通过一个什么样的内存模型来解决多线程对共享内存的读取和写入数据的问题。借用网上的一张图: 图1.2 从上图中我们可以看到,JMM的核心思想是把堆中的内存分成了两部分:主内存和本地内存,主内存为所有线程共享,而本地内存则由线程独享,同时,对于共享变量

java运行机制详细

人盡茶涼 提交于 2020-02-08 23:16:40
JVM( Java 虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。 1.为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编 译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台 相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字 节码时,把字节码解释成具体平台上的机器指令执行。 Java运行机制 Java程序的运行必须经过 编写 、 编译 、 运行 三个步骤。 编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名为.java的Java源文件。 编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,这不像

Java的运行机制

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-08 23:08:40
1、Java程序必须经过编写、编译、运行三个步骤。 编写:输入代码,形成后缀名为.java的Java源文件; 编译:使用Java编译器对源文件进行错误排查的过程,编译后生成后缀名为.class的字节码文件(二进制文件); 运行:使用Java解释器将字节码文件翻译成具体硬件环境和操作系统平台的机器代码,执行并显示结果。 Java程序不能直接运行在现有的系统平台上,必须运行在Java虚拟机(JVM)上。JVM是运行Java程序的软件环境,Java解释器就是JVM的一部分。在运行Java程序时,首先会启动JVM,然后由它来负责执行Java的字节码,并且Java字节码只能运行于JVM上。这样利用JVM就可以把Java字节码程序与具体的硬件平台及操作系统环境分隔开来,只要在不同的计算机上安装针对特定具体平台的JVM,Java程序就可以运行。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级跨平台移植。 注:JAVA程序通过JVM可以实现跨平台特性,但JVM是不跨平台的,也就是说,不同操作系统上的JVM是不同的。 2、Java代码的注释 单行注释 // 多行注释 /* */ 文档注释/** */ 3、命名规则 类名:首字母大写,其后每一个单词的首字母都大写; 方法名、属性名、变量名和对象名:首字母小写,其后每个单词的首字母大写; 关键字、包名:全部小写; 常量:全部大写

【JVM虚拟机】(9)-- JVM是如何处理异常的

試著忘記壹切 提交于 2020-02-08 23:07:20
JVM是如何处理异常的 上篇博客我们简单说过 异常信息是存放在属性表集合中的Code属性表里 ,那么这篇博客就单独讲Code属性表中的exception_table。 在讲之前我们先思考两个问题? 1、为什么捕获异常会较大的性能消耗? 2、为什么finally中的代码会永远执行? 接下来会从JVM虚拟机的角度来解答这两个问题。 一、概念 1、JVM是如何捕获异常的? 1、编译而成的字节码中,每个方法都附带一个 异常表 。 2、异常表中每一个条目代表一个 异常处理器 3、触发异常时,JVM会遍历异常表,比较触发异常的字节码的索引值是否在异常处理器的 from指针到to指针 的范围内。 4、范围匹配后,会去比较 异常类型和异常处理器中的type是否相同 。 5、类型匹配后,会跳转到 target指针所指向的字节码 (catch代码块的开始位置) 6、如果没有匹配到异常处理器,会弹出当前方法对应的 Java栈帧 ,并对调用者重复上述操作。 2、什么是异常表? 1. 每个方法都附带一个异常表 2. 异常表中每一个条目, 就是一个异常处理器 异常表如下: 3、什么是异常处理器?其组成部分有哪些? 1、异常处理器由from指针、to指针、target指针,以及所捕获的异常类型所构成(type)。 2、这些指针的数值就是字节码的索引(bytecode index, bci),可以直接去定位字节码

Java基础一

不打扰是莪最后的温柔 提交于 2020-02-08 20:38:26
一、新手上路 1、下载JDK, http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,安装JDK,安装时候记住安装JDK的路径。 2、服务器JAVA环境变量配置(百度这个很多介绍) JAVA_HOME 安装JDK的路径 Path 中添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; 测试:win+R -> cmd -> 输入命令 java ; javac ; java -version ; 二、编程语言分为:编译型语言和解释型语言 三、Java发展史简介:   Java是Sun于1995年推出的编程语言   1998年 发行版本1.2 更名java2   2000年 1.3;1.4   2004年 5.0   2005年 6.0   2009年 Oracle甲骨文 74亿美元收购Sun,进而取得java版权。   2011年 java7.0   2014年 8.0   2017年9月21日 java9.0 java社区多。 四、java的语言特性:跨平台。   平台即CPU和OS的结合体。   跨平台即可以在不同平台中运行代码

Java虚拟机JVM的小总结

女生的网名这么多〃 提交于 2020-02-08 20:35:54
1.Java的三种核心机制 Java虚拟机 JVM (Java Virtual Machine) 垃圾回收机制 GC ( Garbage Collection) 代码安全性检测机制(Code Security) 2.Java虚拟机JVM JVM可以看做一个以字节码为机器指令的CPU,它是Java语言的运行环境,正是JVM实现了Java语言的跨平台性。 源程序(*.java文件) →Java编译器→ 字节码(*.class文件) →类装载器→ 字节码校验器→解释器→操作系统平台 3.Java语言为什么是跨平台性? 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码(.class file)。然后不同的硬件平台上安装有不同的Java虚拟机(JVM), 由JVM来把字节码(.class文件)再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。实现了“一次编 译,随处运行”。 来源: https://www.cnblogs.com/zssblog/p/5929634.html

关于Java虚拟机JVM的简单了解

时光怂恿深爱的人放手 提交于 2020-02-08 20:35:31
JVM主要功能 Java是一种高级编程语言。 用高级语言编写的程序不能直接在任何机器上运行。 首先,需要将其翻译成特定的机器语言,javac编译器就专门来干这个事儿的,它把Java程序(含有的.java源代码文件)转换成机器代码(称为字节码或.class文件)。 Java虚拟机(JVM)是安装在我们计算机中的虚拟机,JVM自己的机器语言是字节码。 这样子Javac编译器就好处理啦,因为它只需要为JVM生成字节码就行了,而不是为每种类型的机器生成不同的机器代码。 JVM执行Javac编译器生成的字节码并生成输出就OK了。JVM正是java跨平台的原因。 所以,现在我们知道JVM的主要功能是执行编译器生成的字节码。 每个操作系统都有不同的JVM,但是在执行字节码后它们产生的输出在所有操作系统中都是相同的。 这意味着在Windows上生成的字节代码可以在Mac OS上运行,反之亦然。 这就是我们将java称为平台无关语言的原因,下图展示了这个过程: JVM总结: Java虚拟机(JVM)是在实际机器(您的计算机)上运行并执行Java字节代码的虚拟机。 JVM不了解Java源代码,这就是为什么我们需要使用javac编译器来编译* .java文件, 从而获取包含JVM理解的字节代码的* .class文件。 JVM使java可移植(一次编写,随处运行)。 每个操作系统都有不同的JVM

Java基础-JVM堆与栈

独自空忆成欢 提交于 2020-02-08 15:28:10
首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类的定义,静态资源 Student.class eg:Student stu = new Student(); //new 在内存的堆空间创建对象 stu.study(); //把对象的地址赋给stu引用变量 上例实现步骤:   a.JVM加载Student.class 到Code区 b.new Student()在堆空间分配空间并创建一个Student实例 c.将此实例的地址赋值给引用stu, 栈空间 java内存分区 运行时数据区即是java内存,而且数据区要存储的东西比较多,如果不对这块内存区域进行划分管理,会显得比较杂乱无章。程序喜欢有规律的东西,最讨厌杂乱无章的东西。   根据存储数据的不同,java内存通常被划分为5个区域: 程序计数器(Program Count Register)、本地方法栈(Native Stack)、方法区(Methon Area)、栈(Stack)、堆(Heap) 。 程序计数器(Program Count Register)   又叫程序寄存器。JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)

JVM内存划分

半世苍凉 提交于 2020-02-08 15:21:39
JVM中内存划分及其作用 运行时数据区 :这部分由5部分组成,分别为程序计数器、虚拟机栈、本地方法栈、堆、方法区;其中程序计数器、虚拟机栈、本地方法栈是线程独有的(即每个线程都有如此一个区域),而堆与方法区是线程共享的。下面我们再分别从存储内容、是否会发生内存溢出来介绍各个区域。 一、 程序计数器: 是当前线程所执行的字节码的行号指示器(记录当前线程执行到字节码文件的什么位置),没有规定任何内存溢出的情况;如果当前线程执行的是java方法,则计数器存储的是正在执行的字节码指令的地址,若当前线程执行的是本地方法(native修饰的方法),则计数器的值为空。 二、 虚拟机栈: 描述的是java方法执行的内存模型,每个方法在执行的时候就会创建一个栈帧,栈帧就是在虚拟机栈中的,栈帧中存储得有局部变量表、操作数栈、动态链接、方法出入口等信息。在该内存区域可能会出现内存溢出的情况,当栈是不可扩展的,当栈满时再往栈中存元素就会发生StackOverflowError异常;当栈是可扩展的,栈一直扩展直至虚拟机内存不够时将会发生OutOfMemoryError异常。 三、 本地方法栈: 与虚拟机栈是一样的,知识虚拟机栈针对的是java方法,而本地方法栈针对的是native方法。 四、 堆: 我们创建的对象基本都是存储在堆上,也有例外,这里举几个列子后期的优化会使对象实例可能存储在其他的区域