jvm

jvm中的垃圾回收器

泪湿孤枕 提交于 2020-02-09 08:13:46
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。 Serial(串行GC)收集器 Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。 ParNew(并行GC)收集器 ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。 Parallel Scavenge(并行回收GC)收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器。parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。 Serial Old(串行GC)收集器

java的运行机制, JVM

我们两清 提交于 2020-02-09 07:02:45
java程序的运行机制 java语言比较特殊,由java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的字节码,而是生成一种与平台无关的字节码(即*.class文件)。然,这中字节码并不是可执行的,必须使用java解释器来解释执行。因此我们认为,java语言是编译型语言,也是解释型语言   java程序的执行过程必须经过先编译,后解释的步骤。(在dos命令中,用javac,进行编译,用关键字java解释执行) JVM(Java Virtual Machine) Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。 不同平台上的JVM是不同的,当使用java编译器编译java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。JVM是java程序跨平台的关键部分。 开发java的准备       关于JDK JDK提供了开发java应用程序的开发包,,它提供了编译,运行java程序所需的各种工具和资源,包括java编译器,java运行时环境,以及常用的java类库等。    JRE,与jvm的关系     JRE

Java回顾--jvm简单描述

霸气de小男生 提交于 2020-02-09 04:13:14
1、关于JVM的简单叙述:    JVM是Java Virtual Machine(Java 虚拟机 )的缩写。    主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。   其中运行时数据区,即jvm运行时将数据分区域存储,也称Java内存区域,包括:   1、虚拟机栈:     线程私有,与线程生命周期相同。不连续的内存空间。     它描述的是Java方法执行的内存模型:方法创建时会创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。      局部变量表 :是一组变量存储空间,用于存放方法参数和方法内部的局部变量,即八大基础数据类型和引用类型(指向对象地址的引用指针)。      操作栈: 其结构同局部变量表,也是一个以字节长度为单位的数组。不同的是,局部变量表通过索引进行访问,而操作栈则是通过 压栈--出栈 完成的。其中存储数据的方式也和局部变量表一样,如int、long、float、double、reference和returnType的存储。对于byte、short以及char类型的值在压入到操作数栈之前,也会被转换为int。虚拟机把操作数栈作为它的工作区——大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。     

jvm 内存模型

荒凉一梦 提交于 2020-02-09 04:12:53
cpu和计算机内存的交互 在计算机中,cpu和内存的交互最为频繁,相比内存,磁盘读写太慢,内存相当于高速的缓冲区 但是随着cpu的发展,内存的读写速度也远远赶不上cpu。因此cpu厂商在每颗cpu上加上高速缓存,用于缓解这种情况。现在cpu和内存的交互大致如下。 cpu上加入了高速缓存这样做解决了处理器和内存的矛盾(一快一慢),但是引来的新的问题是缓存一致性 缓存一致性 在多核cpu中,每个处理器都有各自的高速缓存(L1,L2,L3),而主内存确只有一个 。 CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找,每个cpu有且只有一套自己的缓存。 如何保证多个处理器运算涉及到同一个内存区域时,多线程场景下会存在缓存一致性问题,那么运行时保证数据一致性? 为了解决这个问题,各个处理器需遵循一些协议保证一致性。【如MSI,MESI啥啥的协议。。】 在CPU层面,内存屏障提供了个充分必要条件 内存屏障(Memory Barrier) 什么时内存屏障 CPU中,每个CPU又有多级缓存【上图统一定义为高速缓存】,一般分为L1,L2,L3,因为这些缓存的出现,提高了数据访问性能,避免每次都向内存索取,但是弊端也很明显,不能实时的和内存发生信息交换,分 在不同CPU执行的不同线程对同一个变量的缓存值不同。 硬件层的内存屏障分为两种:

JVM原理梳理

喜欢而已 提交于 2020-02-09 04:04:19
最近在研究JVM原理,整理心得以便于后续面试复习使用。 一。JVM内存模型(运行时数据区) 说明:这是JVM规定的内存模型,每个具体实现根据厂商有所不同。比如:HotPot 1.8之前有持久带(方法区的实际实现)的概念,其他如IBM J9没有这个概念, 1.程序计数器(PC) 线程执行的字节码的行号指示器,一块比较小的内存,这个指示器一行一行的读取命令进行处理。 不同线程执行的命令肯定是不一样的所以这个需要每个线程有一个。 执行本地方法(Native)时值为unifined空。 该区域是唯一不会OOM(内存溢出)的地方 2.栈 虚拟机栈是描述Java方法执行的内存模型,是动态概念。每个方法执行时会创建一个栈帧,里面存放局部变量,操作数栈,动态链表等信息。 基本数据类型都是直接存放到栈上的,对应到每个方法就是该方法的栈帧。但是,对象都放到堆上,栈里只存放对象的引用。 3.本地方法栈 上面的栈是执行Java字节码,本地方法栈执行的是本地方法,作用相同。本地方法可以使用不同语言实现,比如C++。 4.堆 内存最大的一块,所有对象都在这里创建,GC(垃圾回收的主要战场,注意不是全部)。 内存分配策略: 使用哪种一般有GC方式决定。使用分代复制方法的一般使用指针碰撞,使用标记清除方法的使用空闲列表。 指针碰撞: 内存被占用和空闲区域是规整的,指针指向临界位置

JVM内存结构简单认知

拈花ヽ惹草 提交于 2020-02-09 03:27:46
关于JVM的面试传送门: https://blog.csdn.net/shengmingqijiquan/article/details/77508471 JVM内存结构主要划分为:堆,jvm栈,本地方法栈,方法区,程序计数器 如下图所示: 堆区: 简单概述 :每个Java项目都有唯一对应的一个JVM实例,每一个JVM实例又对应着一个堆区。Java堆是被当前应用所有进程所共享的,在JVM启动时就创建了。堆区的目的就是存放所有new创建实例对象和数组,由此可见堆对于当前应用来说是全局的。   PS:这也就解释了假设有A,B两个Java项目,A项目有a,b,c三个类,a类可以调用b,c三个类,但是在B项目就不可以使用a,b,c三个类了 堆区的特点 : 堆的主要优势是灵活性,它可以的动态的分配内存。编译器不需要知道需要创建对象的时候需要分配多少内存给它,也不需要知道该对象的生命周期。new一个对象的时候会自动从堆中分配内存给它,然后如果长时间没有引用指向该对象时,JVM垃圾回收机制会在某个合适的时间点回收它。 Java堆是jvm管理内存中最大的一块,它也是JVM垃圾回收的主要区域。虽然JVM垃圾回收机制会在某个合适的时间点自动回收没有引用指向的对象,但是作为java开发人员,掌握垃圾回收机制是很重要的,日后还要去学习这个.... 本地方法栈: 虚拟机执行Native方法服务

JVM分代垃圾回收策略的基础概念

天涯浪子 提交于 2020-02-09 03:27:32
一、为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。 试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。 因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适 合它的垃圾回收方式进行回收。 二、如何分代 如图所示: 虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。 其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大

JVM垃圾回收机制

瘦欲@ 提交于 2020-02-09 03:21:30
转自:http://www.importnew.com/1551.html 每个Java程序员迟早都会碰到下面这个错误: java.lang.OutOfMemoryError 这个时候一般会建议采用如下方式解决这个错误: 增加MaxPermSize值 增加最大堆内存到512M(-xmx参数) 这篇文章会具体介绍Java堆空间和参数MaxPermSize的含义。这篇文章涉及下列主题,并采用Hotspot JVM: 垃圾回收器(Garbage Collector,GC) 哪个 JVM? JVM命令行选项 垃圾回收器 垃圾回收器负责: 分配内存 保证所有正在被引用的对象还存在于内存中 回收执行代码已经不再引用的对象所占的内存 应用执行时,定位和回收垃圾对象的过程会占用总执行时间的将近25%,这会拖累应用的执行效率。 Hotspot VM提供的垃圾回收器是一个分代垃圾回收器(Generational GC)[9,16,18]-将内存划分为不同的阶段,也就是说,不同的生命周期的对象放置在不同的地址池中。这样的设计是基于弱年代假设(Weak Generational Hypothesis): 1.越早分配的对象越容易失效; 2.老对象很少会引用新对象。 这种分代方式可以减少垃圾回收的停顿时间以及大范围对象的回收成本。Hotspot VM将其堆空间分为三个分代空间: 1. 年轻代 ( Young

浅谈jvm中的垃圾回收策略

醉酒当歌 提交于 2020-02-09 02:52:51
下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 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 01:25:48
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命令的使用也让我们更能了解jvm构成和特性。 Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo下面做一一介绍 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 命令格式 jps [options] [hostid] option参数 -l : 输出主类全名或jar路径 -q : 只输出LVMID -m : 输出JVM启动时传递给main()的参数 -v : 输出JVM启动时显示指定的JVM参数 其中[option]、[hostid]参数也可以不写。 示例 $ jps -l -m 28920 org.apache.catalina.startup.Bootstrap start 11589 org.apache.catalina.startup.Bootstrap start 25816