jvm

我的面试经之JVM(一)JVM简述

穿精又带淫゛_ 提交于 2020-03-08 18:40:16
Java 跨平台语言 JVM 跨语言平台 Java进化史: 虚拟机:Virtual Machine,对硬件进行模拟的软件,虚拟的计算机 Java虚拟机:执行Jvm字节码的虚拟计算机,是二进制字节码的运行环境 JVM的位置 jvm整体结构 方法区和堆,多个线程共享 Java栈(又叫虚拟机栈),本地方发栈,程序计数器这三个每个线程独有一份 【运行时数据区是单例的,一个虚拟机一个】 【hotspot 才有方法区,其他两大商用虚拟机没有【HotSpot,JRocket,J9】】 class files前边是编译器前端 执行引擎相当于编译器后端 java代码执行流程 第一次编译,把java源文件编译成字节码.class文件,第二次编译JIT编译器把.class文件编译成机器指令文件,并且缓存到方法区 JVM架构模型 指令集架构分为两种,基于栈的指令集架构,基于寄存器的指令集架构 两种指令集架构区别 基于栈式架构的特点:   设计和实现简单【每执行一个方法,就进行一次入栈的操作】,适用于资源受限的系统(eg:嵌入式)   避开了寄存器的分配难题;使用零地址指令分配方式   指令流中的指令大比分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现   不需要硬件实现,可以执性更好,更好实现跨平台 基于寄存器架构的特点:   典型的是x86的二进制指令集

JVM基础:深入学习JVM堆与JVM栈

假如想象 提交于 2020-03-08 14:46:09
以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~ 转自: http://developer.51cto.com/art/201009/227812.htm JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在哪儿,另外JVM堆中存的是对象。JVM栈中存的是基本数据类型和JVM堆中对象的引用。 JVM基础概念:JVM堆与JVM栈 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括:类类型,接口类型和数组。 JVM堆与JVM栈 JVM堆和JVM栈是程序运行的关键,很有必要把他们的关系说清楚。 JVM栈是运行时的单位,而JVM堆是存储的单位。 JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程JVM栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同

JVM概念总结:数据类型、堆与栈

谁都会走 提交于 2020-03-08 14:40:46
  Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;   引用类型的变量保存引用值,引用值代表了某个对象的引用而不是对象的本身,对象的本身存放在这个引用值所标示的地址的位置。   基本的数据类型包括:byte,short,int,long,float,double,boolean,returnAddress   引用类型包括:类类型,接口类型和数组。   堆与栈:堆与栈是程序运行的关键。   栈是运行时的单位,而堆是存储的单位。   栈解决程序的运行问题,即程序如何运行,或者说如何处理数据;堆解决的是数据存储问题,即数据怎么放,放在哪 在Java中一个线程就会对应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行的逻辑不同,因此需要一个独特的线程栈。而堆是所有的线程所共享的。栈因为是运行的单位,因此里面存储的信息都是跟当前线程相关的。包括局部变量、程序的运行状态,方法的返回值等等,而堆只负责存储对象的信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)

JVM学习笔记二:垃圾收集算法

心已入冬 提交于 2020-03-08 12:59:56
垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC、Stack、Native Stack;Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活性的分析,然后利用GC回收算法进行回收,具体算法请看下文。 如何判断对象是否可以回收? 有两种方式:引用计数算法和可达性分析算法,目前主流商业JVM普遍采用可达性分析算法 引用计数算法 引用计数算法顾名思义,为对象的引用计数,每当有一地方引用它时,计数器加1,引用失效(离开作用域时)减1,当计数器值为0时,对象就可以被回收了。引用计数算法优点是判定效率高,缺点是无法解决对象互相引用的问题,使用此技术进行内存管理的技术有微软的COM、Flash、Python等 可达性分析算法 可达性分析算法,基本思路是以GC Roots为根、向下搜索,所走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链可达时,就成为此对象不可用,即可以被回收。注意再注意:该算法的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。分代式GC是一种部分收集(partial collection)的做法。在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC roots的一部分。具体到分两代的分代式GC来说

JVM系列(二) — Java垃圾收集介绍

柔情痞子 提交于 2020-03-08 12:37:52
这篇文章主要从以下几个方面介绍垃圾收集的相关知识   一、判断对象是否已死   二、主流垃圾收集算法   三、内存分配与回收策略   本章节主要从以下几个思考点着手介绍垃圾回收的相关知识:哪些内存需要回收?什么时候回收?如何回收?这也是经典的学习一个知识点的3h方法:what? when? how? 上一个章节已经介绍jvm运行时数据区的内存分布,垃圾回收主要发生在堆这个区,也就是众多对象实例呆着的地方 一、如何判断对象已死?   相信面试过高级java的工程师肯定遇到过面试官这样的问题:两个对象之间互相循环引用,如何回收?换句话说如何判断这两个对象已死?   这里就引出了一个经典算法:引用计数法。是这样设计的:给对象添加一个引用计数器,每当这个对象被引用时,计数器值+1,引用失效时,计数值-1,任何时刻,计数为0 的对象就是不可能再被使用的对象   回到上面的例子,它很难解决互相引用的对象这种情况,于是导致GC无法回收他们   于是出现了另一个经典算法:可达性分析算法,基本思路是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链, 当一个对象到GC Roots没有任何引用链相连,或者称从GC Roots到这个对象不可达时,则证明这个对象是不可用的   作为GC Roots的对象一般有以下几种:虚拟机栈中引用的对象

JVM初识

瘦欲@ 提交于 2020-03-08 11:28:00
###JVM初体验 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 JVM大致可分为三部分 1.Java代码的执行 代码执行也可以分为三个过程 代码编译为class,命令javac 转载class,命令ClassLoader 执行class,亦可分为解释执行与编译执行两部分,编译执行可分为client complier与server compiler 2.内存管理 内存管理大致分为四个部分 内存空间:包含方法区、堆,本地方法栈、pc寄存器 内存分配:有堆上分配、TLAB分配、栈上分配 内存回收:1.用到的算法有:Copy、Mark-Sweep、Mark-Compact,2.sun jdk的分代回收可分为:新生代可用的GC、Minor GC触发机制以及日志格式、旧生代可用的GC、Full Gc触发机制以及日志格式 内存状况分析:jconsole、visualvm、jstat、jmap、MAT 3.线程资源同步与交互机制 线程资源同步:可分为线程资源执行机制和线程资源同步机制,线程资源同步机制:Sychronized的实现机制,lock/unlock实现机制 线程交互机制:Object.wait/notify/notifyall

Unsupported major.minor version 49.0的错误解决

岁酱吖の 提交于 2020-03-08 05:15:21
Unsupported major.minor version 49.0的错误解决 Posted on 2011-01-14 16:49 chinaifne 阅读( 15840) 评论( 0) 编辑 收藏 在装2个不同版本JDK时遇到了这个问题,在网上钩了一吧!查到一个讲解比较好的资料。 一:要解决的问题 我们在尝鲜 JDK1.5 的时候,相信不少人遇到过 Unsupported major.minor version 49.0 错误,当时定会茫然不知所措。因为刚开始那会儿,网上与此相关的中文资料还不多,现在好了,网上一找就知道是如何解决,大多会告诉你要使用 JDK 1.4 重新编译。那么至于为什么,那个 major.minor 究竟为何物呢?这就是本篇来讲的内容,以使未错而先知。 我觉得我是比较幸运的,因为在遇到那个错误之前已研读过《深入 Java 虚拟机》第二版,英文原书名为《Inside the Java Virtual Machine》( Second Edition),看时已知晓 major.minor 藏匿于何处,但没有切身体会,待到与 Unsupported major.minor version 49.0 真正会面试,正好是给我验证了一个事实。 首先我们要对 Unsupported major.minor version 49.0 建立的直接感觉是:JDK1.5

JVM内存管理基本知识

不问归期 提交于 2020-03-08 04:30:34
这篇本来是想好好写的,今天看了一天了的,可是,组会好像有种要悲剧的感觉啊。。暴风雨前的宁静,尽量记录一些吧。 上周把爬虫代码优化后,就哈皮哈皮的和未优化的版本一起跑了。起初,由于未优化的版本已经run了几天了,内存占用在200M多,而发现优化后的内存占用只有40M,所以很开心。但是不久就发现,优化后的版本,内存占用也会慢慢增加,大有一种“老娘给你分多少,你就要用多少”的赶脚。 用jprofiler监控,自己开发的类的对象数量都比较正常,所以决定学习一下JVM内存管理相关的东西。 JVM主要管理两种类型的内存:堆(Heap)和非堆。 按照官方的说法:“Java虚拟机具有一个堆, 堆 是 运行时 数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。” “在JVM中堆之外的内存称为 非堆 内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到

JVM—垃圾回收GC算法

不想你离开。 提交于 2020-03-07 18:59:27
1 GC算法简介 算法 特点 标记-清除 分为“标记”和“清除”两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块。 标记-整理 先标记、再整理,最后清理 分代收集 划分新生代和老年代 2 标记-清除 2.1 流程 分为“标记”和“清除”两个阶段: (1)首先标记出所需要回收的对象(引用计数法和可达性分析,两次标记过程); (2)在标记完成后统一回收所有被标记的对象。 2.2 缺点 (1)效率问题:标记和清除两个过程的效率不高; (2)空间问题:标记清除后会 产生大量不连续的内存碎片 ,导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 3 复制 3.1 流程 可以解决效率问题,将可用的内存 按容量划分为大小相等的两块 。 (1)每次只使用其中的一块; (2)当这一块用完了,就将还存活的对象复制到另一块上; (3)然后再把已使用的内存空间清理掉。 3.2 优点    每次对整个半区 进行内存回收,避免内存碎片问题,只需 移动堆顶指针 ,按顺序分配内存即可,实现简单,运行高效。 3.3 缺点   将 内存缩小为原来的一半 ,代价高;当对象存活率较高时需要进行较多的复制操作,效率降低。 3.4 应用   回收 新生代 ,新生代中分为Eden空间和两块较小的Survivor空间

JVM深入解析

有些话、适合烂在心里 提交于 2020-03-07 14:37:23
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中,各种字节码指令往栈中存取数据。 d、动态链接