jvm基础理解

一.jvm运行时内存区域

包含堆,虚拟机栈,本地栈(调用native方法时用到),方法区(perm区),程序计数器。

假设32位操作系统,这时系统限制每个进程大小为2G。这样上述这些区域(对于本地栈及程序计数器来讲,是无法设置的,hotspot有提供-Xoss参数用于设置本地方法栈。但实际是无效的)可以用相应参数设置,共同划分全部2G内存。

注意还有一块直接内存,不属于JAVA运行时区域。但是它的空间用得太多的话,还是受限于物理内存和虚拟内存总大小,因此也会抛出OutOfMemory。典型的redis中有大量使用直接内存。redis负责使用System.gc()告诉虚拟机要回收直接内存(触发FULL GC)。如果将 DisableExplicitGC打开,这时如果大量用直接内存将发生 OutofMemmory Directory Memonry。原因是虚拟机只会在FULL GC的时候触发对直接内存的清理。

二.垃圾回收

垃圾回收围绕两个问题:

1.怎样认为一个对象是该回收了的对象?如何找出?

2.找出之后,如何做到有效清除,并使内存碎片最少,回收效率更高?

对于第一个问题,我们很自然的想到引用计数,但引用计数存在循环引用的问题。

还有一种就是根搜索算法,也就是说从当前Root区域开始(使用到对象的区域,如线程栈,方法区中静态引用,常量引用等)标记出所有可达的对象。

最后那些没有被标记的对象就认为是需要回收的对象。

现在主流虚拟机实现用的都是这种方法。

对于第二个问题,找出之后,如何做到有效清理,内存碎片最少,回收效率更高?

首先要回收快,比如给你一个8G的内存区域,这时每次垃圾回收都要扫描8G内存必定使回收效率很低。

虚拟机根据对象存活期不同的特点,想到将区域分为年轻代和老年代。这时假设将年轻代和老年代都是4G,这时可以分别对这两块区域进行回收。

年轻代中对象生命周期短,对它进行回收效益比老年代的大。

考虑只将年轻代分成一块4G会有什么问题?

这时你会发现当对年轻代做完垃圾清除后,会有很多碎片存在(由于很多对象被清除了)。

整理碎片是相当耗时的一个过程。

那怎么解决?

虚拟机将年轻代分为eden及两块survisor区域。每次只使用eden及一块survisor。

每次新建的对象先进入eden区,如果这时engen区不够放了,这时触发minor gc。将扫描eden及一块survisor。将要回收的对象清理掉,还存活的放入到另一块survisor。这样每次回收后对于eden区都不会有内存碎片。

上述讲的对于年轻代的垃圾回收使用的就是标记-复制算法(缺点是需要一块备用区域)。

对于老年代来讲,如果还使用标记-复制算法,这时需要另一块区域作为备用。

这时候由于老年代对象存活率高,因此每次回收后,需要大量的对象拷贝到备用区域,不太合算。

因此对于老年代来讲,使用的是标记-清除算法(或标记整理),即先找出所有要清理的对象,然后清除掉。

这时必然会有碎片在,因此对于像CMS这样的并行老年代回收算法,可以设置多少次FULL GC后触发一次内存整理。

下面列下现有的JVM垃圾回收器:

对于年轻代有:

 serial(单线程,回收时停止所有用户线程),

par New(多线程,停止所有用户线程)

 parallel scavange(多线程,停止所有用户线程,与 par New类似。但可以控制响应时间,通过缩小年轻代大小,进而减少回收空间来达到)

对于老年代有:

serial old(单线程,停止所有用户线程)

parallel old(多线程,停止所有用户线程。通常与parallel scavange一起使用)

CMS(多线程,部分回收阶段不需要回收用户线程,达到可控的响应时间)

G1

由于par New与CMS采用了全新架构,因此par New与CMS一起使用。

parallel scavange与parallel old通常一起使用。

jvm基础理解

时间: 2024-08-10 17:19:59

jvm基础理解的相关文章

JVM的理解

JVM自身物理结构 JVM是Java的核心和基础,在Java编译器和os平台之间的虚拟处理器,它是一种基于下层的操作系统和硬件平台利用软件方法来实现的抽象的计算机,Java编译器只需面向jvm,生成jvm能理解的代码或者字节码文件.Java源文件编译器,编译成字节码程序,通过jvm将每一条指令翻译成不同平台的机器码,通过特定的平台运行,简单来说,jvm就相当于柴油机,他只能用Java(柴油)运行,jvm就是Java的虚拟机,有了jvm才能运行Java程序

JVM基础:深入学习JVM堆与JVM栈(转)

JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放.放在哪儿,另外JVM堆中存的是对象.JVM栈中存的是基本数据类型和JVM堆中对象的引用. JVM基础概念:JVM堆与JVM栈 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值."引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型

【转】JVM基础概念总结:数据类型、堆与栈

JVM基础概念总结:数据类型.堆与栈.基本类型与引用类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte, short, int, long, char, float, double, Boolean, returnAddress 引用类型包括:类类型,接口类型和数组. 堆与栈 堆和栈是

JVM深入理解

JVM深入理解 一.JVM介绍 JVM应用百度百科的原话是: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.JAVA语言的一个非常重要的特点就是与平台的无关性. 而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言

关于Java面试知识点解析——JVM基础篇

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视. 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说).今天给大家分享下 Java面试知识点解析--JVM基础篇 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是

伪元素、伪类基础理解

前几天同事问我css中单冒号和双冒号是什么意思,我也模糊得很,只有个笼统的概念就是:伪元素和伪类.一直以为,页面布局中很少使用到伪类,结果细细研究发现我们经常使用的hover就是一个最简单的伪类,顿时觉得自己太OUT了,紧跟着这两天都在看这些东西,其实伪类最简单的理解就是用于向某些选择器添加特殊的效果. 具体伪类.伪元素有哪些我就不一一列举,在w3c中列举的很清楚.我主要写写应用的实例. 1.来个简单的,咱们最常用到的向超链接添加不同的颜色: <html> <head> <m

C#委托零基础理解

C#委托零基础理解(转) 1,  为什么使用委托  2.什么是委托  3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法.与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的. 什么是委托? 委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值. 如何使用委托 下面咱们

JVM基础和调优(二)

主要讲述java虚拟机的内存体系结构 了解了JVM 的一些基础之后,我们来看看java虚拟机内存的体系结构,这个是理解JVM垃圾收集算法的前提,理解了内存结构我们才能够针对不同的部分根据我们的程序进行优化.前面已经说明了,java的堆和栈,但是只是局部的说了一下,没有在java内存体系中说明. 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力

JVM基础和调优(一)

最近的项目中,出现了内存和性能的问题,需要优化,所以趁着这个机会,把自己关于java虚拟机的东整理一下,不对的地方,欢迎指出. 数据类型,因为在java的优化的过程中,检测到的数据类型一般比较的基础,毕竟复杂的数据类型就是有基础的组合而来的. Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,表示的是数据本身的值,是数据中的最基础的部分,一般包含: byte,short,int,long,char,float,double,Boolean,returnAddr