jvm

基础知识

别说谁变了你拦得住时间么 提交于 2020-02-19 09:09:45
1.java各版本和体系架构 J2EE(JAVAEE) -java 2 Enterprise Edition -定位在服务器端的应用 J2SE(JAVASE) -Java 2 Standard Edition -定位在个人计算机上的应用 J2ME(JAVAME) -java2 Micro Edition -定位在消费性电子产品的应用上 2. JDK & JRE & JVM JDK --java Development kit Java开发工具包 JRE --java Runtime Environment Java运行时环境 JVM --java Virtual Machine JAVA虚拟机 3. JVM 和Java的跨平台操作 Welcome.java--- javac Welcome.java (编译)---Welcome.class-- java Welcome (执行)---JVM for UNIX ---JVM for Windows ---JVM for Others 来源: https://www.cnblogs.com/hapyygril/p/12329714.html

2020春招——JVM复习总结篇

≡放荡痞女 提交于 2020-02-19 05:00:40
一. 基本概念: JVM是可运行Java代码的假想计算机 ,包括一套字 节码指令集、一组寄存器、一个栈、一个垃圾回收堆 和 一个存储方法域 。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 二. 运行过程: 我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。也就是如下: ① Java 源文件—->编译器—->字节码文件 ② 字节码文件—->JVM—->机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。 三. 线程 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。 当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法

JVM内存管理

一世执手 提交于 2020-02-19 02:17:09
什么是java内存管理? 首先jvm的运行时数据区域可以划分为堆,栈,方法区,程序计数器。栈又分为虚拟机栈和本地方法栈。 虚拟机栈中存放栈帧,每一个栈帧中存有局部变量表,操作数栈,动态连接等信息,java方法从开始到结束代表着栈帧的一次入栈出栈操作。本地方法栈是为native方法服务的。 程序计数器:当前线程执行字节码时的行号指示器。 堆:用来存放数组和实例化的对象。 方法区:用来存储类信息,final常量,static静态变量,即时编译器编译的代码等,其中还包括运行时常量池,用来存放字面量和符号引用。 其中堆内存比较重要,可能发生的问题是内存泄露或者是内存溢出。内存泄漏是指GC没有回收掉废弃对象导致一直占用空间。内存溢出是指堆内存已满。 垃圾回收策略: 引用计数法,可达性分析法。 标记清除算法,标记整理算法,复制算法,分代算法。 永久代的GC主要回收废弃变量和无用的类。 分代的原因是提高GC性能 每一次GC,90%的对象被回收 根据对象寿命可以分为新生代和老年代。新生代表示对象生命周期短,被回收几率高,主要是Minor GC,老年代表示对象寿命周期长,回收几率低。新生态中主要使用复制算法,老年代主要使用标记清除或标记整理算法。 新生代还可以分为Eden和Survivor区域。一块Eden和两块Survivor。复制算法的一种改进。

【JVM】分析Java的ClassLoader机制及相关小结

ぐ巨炮叔叔 提交于 2020-02-19 00:47:18
首先我们知道Java源码经过 javac 编译为 class文件 再经过加载器加载到 内存中(JVM运行时数据区) 经过加载的文件包括 Java Source文件 Java Class文件(二进制文件) 我们还要理解清楚Class 与Object 的区别: Class 指的是类,在jdk1.8以后称为元数据(metadata),其包含有类的描述信息。 Object 指的是对象/实例 类加载器: 是指把Java类文件加载到内存中 (其中包含有一个重要机制/模型--- 双亲委派 ) 为了更好理解类加载的过程和相关机制,我们来根据jdk源码了解下类加载器ClassLoader和他最主要的方法loadClass() public abstract class ClassLoader ClassLoader是一个抽象类,在源码中sun公司是这么解释这个类的(截取一小段) * A class loader is an object that is responsible for loading classes. The * class <tt>ClassLoader</tt> is an abstract class. Given the <a * href="#name">binary name</a> of a class, a class loader should attempt to

JVM内存结构

和自甴很熟 提交于 2020-02-18 22:20:51
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。 先看一张图,这张图能很清晰的说明JVM内存结构布局。 Java的内存结构: JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。 在通过一张图来了解如何通过参数来控制各区域的内存大小 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。 -XX:MaxNewSize设置新生代最大空间大小。 -XX:PermSize设置永久代最小空间大小。 -XX:MaxPermSize设置永久代最大空间大小。 -Xss设置每个线程的堆栈大小。

JVM垃圾回收机制和常用算法

孤街醉人 提交于 2020-02-18 22:20:22
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构、 JVM、集合、多线程、数据库这几点在面试的时候比较多。今天总结了几个JVM比较问的多的问题和答案希望可以帮到大家。 1、首先就是JVM垃圾回收机制和算法 这个应该是问得最多的几个问题之一了,大家都知道java是由sun公司发明的(后来由于经营不善被甲骨文收购了),Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也有所不同。 GC(Garbage Collector)在回收对象前首先必须发现那些无用的对象,如何去发现定位这些无用的对象?一共有两种搜索算法:引用计数器算法、根搜索算法,由于引用计数器算法已经被废弃,所已这里主要说明根搜索算法: 根搜索算法: 根搜索算法是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(Reference Chain),当一个对象没有被 GC Roots 的引用链连接的时候,说明这个对象是不可用的。 GC Roots 对象包括: a) 虚拟机栈(栈帧中的本地变量表)中的引用的对象。 b) 方法区域中的类静态属性引用的对象。 c) 方法区域中常量引用的对象。 d) 本地方法栈中 JNI(Native 方法)的引用的对象。

JVM 初始

淺唱寂寞╮ 提交于 2020-02-18 19:35:43
  我们刚学习java的时候,从来没有想过new一个对象后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,似乎我们也极少碰见过内存溢出或者内存泄露这种事,看上去似乎是那么的洒脱,可问题就出在这里,因为这就相当于我们把内存管理的权限下放了,下放给了jvm虚拟机,而一旦出现内存泄露或者内存溢出时,如果你不对你这个总管的工作原理以及内部运作机制不了解,解决这个问题将会比较困难。   我们写的java程序运行在jvm中,而jvm虚拟机会根据不同的需求,把它自己管理的内存区划分为几个重要的区,每个区域的作用也更不相同。 一,JVM运行时内存   1,方法区   程序里面写的变量,静态变量,已被jvm加载的类信息等都会存在这个片区,该片区被所有线程共享。   2,本地方法栈   为本地方法提供相关的一系列服务,需要注意的是该区也会抛出内存溢出和泄露的异常(什么是本地方法?有时java应用需要与java外面的环境交互,比如用java写的程序需要与一些底层系统或某系硬件交互时,本地方法正是这样的一种交流机制,它为我们提供了一个非常简洁的接口封装,直接调用即可,不需要关注底层的实现细节。)   3,程序计数器   该区占用内存空间较小

JVM组成与作用

与世无争的帅哥 提交于 2020-02-18 03:15:30
class loader 类加载器:加载类文件到内存。Class loader只管加载,只要符合文件结构就加载,至于能否运行,它不负责,那是有Exectution Engine 负责的。 exection engine :执行引擎也叫解释器,负责解释命令,交由操作系统执行。 native interface:本地接口。本地接口的作用是融合不同的语言为java所用。 Runtimedata area 运行数据区:运行数据区是jvm的重点,我们所有所写的程序都被加载到这里,之后才开始运行。 stack:栈也叫栈内存,是java程序的运行区,是在线程创建时创建,它的生命周期跟随线程的生命周期,线程结束栈内存释放;对于栈来说不存在垃圾回收的问题,只要线程一结束,该栈就结束。栈中的数据以栈帧的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的集合,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“先进后出”原则。 堆内存:一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类的加载器读取了类文件之后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分三部分:永久存储(用于存放jdk自身携带的class,interface的元数据

JVM和JMM内存模型

别说谁变了你拦得住时间么 提交于 2020-02-17 21:51:56
JVM内存模型 JVM内存模型主要指运行时的数据。 线程独占 栈(Stack) 栈,也叫方法栈。 线程私有的。 线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。 调用方法时执行入栈,方法返回时执行出栈。 本地方法栈(Native Method Stack) 与栈类似,native方法使用本地方法栈。 程序计数器(Program Counter) 每个线程工作时都有一个独立的计数器,保存着当前线程所执行的字节码位置。 线程共享 堆(Heap) 线程共享。 存放对象实例。 方法区(Method Area) 也叫非堆区。 存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 JDK1.7 永久代和JDK1.8 Metaspace都是方法区的实现。 JMM内存模型 主内存、线程自己的工作内存 原子性 基本数据读写,如 int a = 10; synchronized 关键字 可见性 volatile 关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序) synchronized 关键字 有序性 volatile 关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序) synchronized 关键字 happens-before规则 程序顺序规则

JVM(19)之 Class文件常量池

ぃ、小莉子 提交于 2020-02-17 07:34:01
开发十年,就只剩下这套架构体系了! >>> 在上一博文Class文件中,我们了解了Class文件的一些基础知识。他的整个内部结构就是一张很大的表,我们就是从这张表入手,一一分析每个部分的结构。继续看这张表:   接着上一博文所说,魔数后面分别是次版本号和主版本号。由上图可知其分别占用两个字节。   被蓝色框框住的就是次版本号,划红线的就是主版本号。再次说明,Class文件内部的数据是按照规则紧凑排列的,中间不会有空隙。   接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。依然看上图可知该数据项是占用2个字节,因此顺着主版本号往后面数两个字节得到:0x002E(16进制),即十进制的51,也就是说常量池中有50项常量,索引从1到50。   这里所指的常量与JAVA代码中所说的常量有所不同,这里的常量主要包括字面量和符号引用,这两个概念很好理解。 字面量跟JAVA代码中的常量概念类似,如字符串、常量的值等等。 符号引用指的是类与接口的全限定名、字段、方法的名词和描述符。可以暂时理解为类、接口、字段、方法的名字。这里我们来回忆一下类加载机制中的解析阶段:他是将符号引用转化为直接引用。直接引用指的就是可以直接指向目标的指针。可以粗略的理解为:符号引用只是用一些符号来描述他要引用的目标,而直接引用才是真正的指向了他要引用的目标。