jvm

JVM-内存模型

血红的双手。 提交于 2020-03-30 19:30:43
https://www.cnblogs.com/aishangJava/p/9541920.html 原创好记性不如烂笔头_ 最后发布于2019-02-16 10:42:10 阅读数 22616 收藏 展开 运行时数据区域 程序计数器:线程私有;记录指令执行的位置;这里不会出现OutOfMemoryError 虚拟机栈:线程私有;生命周期和线程一致;存储局部变量表、操作数栈、动态链接、方法出口等信息。(局部变量表:存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址);会出现的异常:1、StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度;2、OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。) 本地方法栈:线程私有;为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。 堆:线程共享;JVM 所管理的内存中最大的一块区域,主要是存放对象实例和数组;会有OutOfMemoryError:如果堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出该异常。 方法区:线程共享

Java面试常见知识点总结(一)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-30 16:00:55
1.sleep()和wait(): Java中的多线程是一种 抢占式 的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 ● 共同点 : (1) 他们都是在 多线程 的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 (2) wait()和sleep()都可以通过 interrupt() 方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。 需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。 ● 不同点 : (1) 每个对象都有一个锁来控制同步访问。 Synchronized 关键字可以和对象的锁交互

Java虚拟机原理

北战南征 提交于 2020-03-29 07:55:49
1、编译机制 分析和输入到符号表: 词法分析:将代码转化为token序列 语法分析:由token序列生成抽象语法树 输入到符号表:将类中出现的符号输入到类的符号表 注解处理: 处理用户自定义注解,之后继续第一步 根据符号表进行语义分析并生成class文件,并进行相关优化 虚拟机数据类型、字节码文件格式、虚拟机指令集 2、执行机制 2.1、加载、链接、初始化 2.1.1、加载 双亲委派、线程上下文类加载器、Web容器、OSGi: http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 2.1.2、链接 校验:校验二进制字节码格式是否符合Java Class File Format规范 准备:为类的静态属性分配内存和默认值,并加载引用的类或接口 解析:将运行时常量池中的符号引用替换为直接引用(静态绑定) 2.1.3、初始化 类的初始化时机: 创建类的实例 初始化某个类的子类(满足主动调用,即访问子类中的静态变量、方法) 反射(Class.forName()会触发,ClassLoader.loadClass()及X.class不会触发) 访问类或接口的静态变量(static final常量除外,static final变量可以) 调用类的静态方法 java虚拟机启动时被标明为启动类的类 初始化顺序: 父类静态成员、静态代码块

JVM史上最最最完整深入解析(12000字噢)

空扰寡人 提交于 2020-03-27 18:12:07
3 月,跳不动了?>>> 点点这个链接免费获取: 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 工作之余,总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。(1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double

JVM之GCRoots详解

倾然丶 夕夏残阳落幕 提交于 2020-03-27 10:54:29
JVM之GCRoots详解 目录 面试题引子 什么是垃圾 判断对象是否可以被回收之引用计数法 判断对象是否可以被回收之枚举根节点可达性分析 Java中可以作为GC Roots的对象 1. 面试题引子 一面:GC Roots如何确定?哪些对象可以作为GC Roots? 2. 什么是垃圾 1.简单说就是内存中已经不再被使用到的空间就是垃圾 3. 判断对象是否可以被回收之引用计数法 Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。 因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,给对象中添加一个引用计数器,每当有一个地方引用它,计数器值加1,每当有一个引用失效时,计数器值减1。 任何时刻计数器值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象。 那为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题。 4. 判断对象是否可以被回收之枚举根节点可达性分析 为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法。 所谓"GCroots,或者说tracingGC的“根集合”就是一组必须活跃的引用。 基本思路就是通过一系列名为”GCRoots”的对象作为起始点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GCRoots没有任何引用链相连时,则说明此对象不可用

JVM笔记(一) Java内存区域

蓝咒 提交于 2020-03-27 08:38:33
Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域。每当运行一个java程序时,就会启动一个虚拟机。 具体的区域如图所示: 同时,方法区 与 堆 是由所有线程共享的数据区;而 虚拟机栈、本地方法栈、程序计数器 则是被线程隔离的区域。 一、程序计数器 什么是程序计数器? 概念 :就是当前线程所执行的字节码的行号指示器。 JVM的概念模型中,字节码解释器通过改变这个计数器的值来选取下一条字节码指令。 JVM的多线程其实就是通过线程轮流切换并分配处理器执行时间的方式来实现的( 在任何一个确定的时刻内,一个处理器都只会执行一条线程中的指令 )。为了线程切换后能够恢复到正确的执行位置,每条线程都需要有 独立的程序计数器 ,各线程计数器互不影响,独立存储。 所以,程序计数器是 线程私有 的内存区域 如果线程执行一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,则计数器的值为空。 Java虚拟机规范中唯一一个 没有规定任何OutOfMemoryError情况 的区域。 二、Java虚拟机栈 线程私有,生命周期与线程相同。 虚拟机描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个 栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。(PS

JVM内存

巧了我就是萌 提交于 2020-03-27 08:34:27
Java内存模型: Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。 2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。 3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。 4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。 5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。 6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。 来源: https://www.cnblogs.com/ng-xixi/p/9942099.html

「 Offer收割机之JVM」:生存还是毁灭

老子叫甜甜 提交于 2020-03-27 07:29:07
这两天,广州的天气又开始热了起来,又到了小动物交配的季节,啊呸,又到了一个收割 offer 的季节。年底将至,又到了面试的高峰期,JVM 作为Java 程序员面试绕不过的一道坎儿,它又来了,你准备好了吗? 说说引用 面试官 A:小伙几,上篇我们说到了 JVM 收集的两种算法 —— 引用记数法和可达性分析算法,你对这两种算法的理解很清晰,那么这两种算法有一个很重要的点,就是『引用』,其实无论是引用记数法和可达性分析算法都离不开引用,那么你来谈谈引用吧。 我: 这个啊,简单,引用(reference)就是一块内存存储着另一块内存地址(自信脸 面试官 A:说的倒也没错,但是过于片面,那么你能不能详细讲一下引用呢? 我:上白板,我直接上图吧(熟练的拿起马克笔 面试官 A:那么你能不能详细的说一下这四种引用是在什么情况下出现的呢,它们分别代表了什么意义? 我:先说说强引用吧,我们日常中最常见到的就是强引用(拿起桌上的白板,开始手写代码,就像这样的,就属于强引用,它有多强呢,就是只要强引用存在,GC 永远不会对它下手,嗯,你可以理解为就是范闲,皇上的私生子。 String s = "vi的技术博客"; s = "技不可失"; 面试官 A:你也看庆余年啊,话说你看过原著没,结局是什么给我剧透剧透呗。 我:咳咳,老哥这样不太好吧,这是我的微信:cm_950825,有什么咱们私聊好吧,不要砸我

JVM结构、GC工作机制详解

喜你入骨 提交于 2020-03-26 20:06:48
版权声明:本文为博主原创文章,未经博主允许不得转载。 目录 (?) [+] 题外话:最近在应聘阿里2015暑期实习,感触颇多。机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累。知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你?关于JVM和GC,我相信学 Java 的绝大部分人都听过,很多公司的面试官都爱问,一开始我也很头痛,问这么底层干什么,所以我每次面试也只是看看答案敷衍了事。最近面完阿里感觉真不能这样,知识不仅要知其然,还要知其所以然。其实弄懂了JVM和GC,对我们理解很多java知识都有帮助。网上有很多关于GC和JVM的文章,这篇博文主要是根据我最近看《深入理解Java虚拟机》的一些体会总结出来的,希望对新手有些帮助,也欢迎大牛拍砖。文章主要分为以下四个部分 JVM结构、内存分配、垃圾回收 算法 、垃圾收集器 。下面我们一一来看。 一、JVM结构 根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader) :在JVM启动时或者在类运行时将需要的class加载到JVM中。(右图表示了从java源文件到JVM的整个过程,可配合理解。 关于类的加载机制,可以参考 http://blog.csdn.net/tonytfjing/article/details/47212291 )

Jvm加载jar包的顺序

廉价感情. 提交于 2020-03-26 11:55:48
使用-XX:+TraceClassPaths或者在服务器上执行jinfo时,都能得到classpath包含的jar包,例如: java.class.path = local/aaa/lib/spring-data-redis-1.8.3.RELEASE.jar:/usr/local/aaa/lib/spring-tx-4.3.8.RELEASE.jar:/usr/local/aaa/lib/spring-jdbc-4.3.7.RELEASE.jar:/usr/local/aaa/lib/classmate-1.3.1.jar:/usr/local/aaa/lib/javax.servlet-api-3.1.0.jar:/usr/local/aaa/lib/mongodb-driver-3.4.2.jar:/usr/local/aaa/lib/xml-apis-2.0.2.jar:/usr/local/aaa/lib/ufc-api-utils-2.0.0.jar:/usr/local/aaa/lib/log4j-over-slf4j-1.7.25.jar:/usr/local/aaa/lib/tomcat-embed-websocket-8.5.14.jar:... 这些jar的顺序不同的机器总是不一样的,平时没有问题,所以也没有细想过,这些jar包的顺序为什么会不一样的。 在