JVM垃圾处理方法(标记清除、复制、标记整理)

  1、标记清除

    标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象。

    清除阶段:清除所有未被标记的对象。

  2、复制算法

    将原有的空间分为两块,每次只使用其中的一块,将正在使用的内存中的存活的对象复制到未使用的内存块中,

    然后清除正在使用的内存块中的所有对象。

  3、标记----整理

    1.标记阶段:先通过根节点,标记所有从根节点开始的可达对象,为被标记的为垃圾对象

    2、整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有空间

  三种算法的比较

    1、效率:复制算法 > 标记/整理算法 > 标记/清除算法(此处的效率只是简单的对比时间复杂度,实际情况不一定如 此)。

    2、内存整齐度:复制算法=标记/整理算法>标记/清除算法。

    3、内存利用率:标记/整理算法=标记/清除算法>复制算法

JVM如何GC,新生代,老年代,持久代都储存那些东西,以及各个区的作用?

  1、新生代

      在方法中去new一个对象,那这个方法调用完毕后,对象就会被回收,这个就是一个典型的新生代对象。

  2、老年代

      在经历了N次垃圾回收后仍旧存活的对象就会被放到老年代中。而且大对象直接直接进入老年代

      当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代

  3、永久代

      即方法区

GC用的引用可达性分析算法中,那些对象可作为GC Roots 对象?

  1、java虚拟机栈中的对象

  2、方法区中的静态成员

  3、方法区中的常量引用对象

  4、本地方法区中的JNI(Native方法)引用对象。

什么时候进行MinGC 、FullGC

  1、MinGC

      1》新生代中的垃圾收集动作,采用的是复制算法

      2》对于较大的对象,在Minor GC的时候可以直接进入老年代

  2、FullGC

      1》Full GC 是发生在老年代的垃圾收集动作,采用的是标记--清除/整理算法

      2》由于老年代的对象几乎都是在Survivor去熬过来的,不会那么容易死掉,因此Full GC发生的次数不会有Minor GC

        那么频繁,并且Time(Full Gc)>Time(Minor Gc)

Java虚拟机内存的划分,每个区域的功能

  • 程序计数器(线程私有)

     ○ 线程创建时创建,执行本地方法时其值为undefined。

  • 虚拟机栈(线程私有)

     ○ (栈内存)为虚拟机执行java方法服务:方法被调用时创建栈帧-->局部变量表->局部变量、对象引用 ○ 如果线程请求的栈深度超出了虚拟机允  许     的深度,就会出现StackOverFlowError。-Xss规定了栈的大空间

    ○ 虚拟机栈可以动态扩展,如果扩展到无法申请到足够的内存,会出现OOM

  • 本地方法栈(线程私有)

    ○ java虚拟机栈是为虚拟机执行java方法服务的,而本地方法栈则为虚拟机执使用到的Native方法服务。

     ○ Java虚拟机没有对本地方法栈的使用和数据结构做强制规定。Sun HotSpot把Java虚拟机栈和本地方法栈合二为一

    ○ 会抛出StackOverFlowError和OutOfMemoryError

  • Java堆

    ○ 被所有线程共享,在Java虚拟机启动时创建,几乎所有的对象实例都存放到堆中

    ○ GC的管理的主要区域

    ○ 物理不连续,逻辑上连续,并可以动态扩展,无法扩展时抛出OutOfMemoryError

  • 方法区

    ○ 用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码的数据

    ○ Sun HotSpot 虚拟机把方法区叫做永久待(Permanent Generation)

  • 运行时常量池

    ○ 受到方法区的限制,抛出OutOfMemoryError

JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息

  • 常常需要在隔两分钟后再次收集一次thread dump,如果得到的输出相同,仍然是大量thread都在等待给同一个 地址上锁,那么肯定是死锁了。

    

java JVM虚拟机的更多相关文章

  1. JAVA JVM虚拟机选项:Xms Xmx PermSize MaxPermSize 区别

    Xms : 是指设定程序启动时占用内存大小.一般该值设置大的会使程序启动快,但是可能会使本机暂时变慢. Xmx : 是指设定程序运行期间最大可占用的内存大小,如果程序运行需要占用更多的内存,超出这个 ...

  2. 认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别

    点击window---->preferences---->配置的tomcat---->JDK,在Optional Java VM arguments:中输入 -Xmx512M -Xm ...

  3. Java JVM虚拟机选项Xms/Xmx/PermSize/MaxPermSize(转)

    通过JVM的这些选项:Xms/Xmx/PermSize/MaxPermSize可以牵扯出很多问题,比如性能调优等. 说明:以下转载没经过实践. 经验实例(参考): 设置每个线程的堆栈大小.JDK5.0 ...

  4. java jvm虚拟机类加载器

    在Java中任意一个类都是由这个类本身和加载这个类的类加载器来确定这个类在JVM中的唯一性. 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到J ...

  5. java jvm虚拟机类加载过程

    加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这 ...

  6. 【转载】Java JVM : Xms Xmx PermSize MaxPermSize 区别

     转载自:http://cxh61207.iteye.com/blog/1160663 java JVM虚拟机选项: Xms Xmx PermSize MaxPermSize 区别 Xms 是指设定程 ...

  7. java语言与jvm虚拟机简介

    一.java语言 1.1 支持面向对象编程oop 强调支持,因为java同样可以面向过程编程. oop的三大特性是:封装.继承.多态. 封装主要针对成员变量而言,oop的思想要求成员变量均为私有,不应 ...

  8. Powershell远程在Azure A7虚拟机执行Java JVM失败

    近期.使用Powershell脚本在A7 (8核,56G内存)配置的 Azure VM(Virtual Machine.虚拟机)上远程运行Java JVM时 (java.exe -version).总 ...

  9. Java中JVM虚拟机详解

    1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...

随机推荐

  1. 【JavaScript从入门到精通】第三课 初探JavaScript魅力-03

    第三课 初探JavaScript魅力-03 函数传参 上节课的时候我们已经讲了什么是函数,实际上,函数在功能上就类似于css的class一样,将一段代码包裹起来使用.为了让函数的功能更加的丰富和实用, ...

  2. Linear SVM和LR的区别和联系

    首先,SVM和LR(Logistic Regression)都是分类算法.SVM通常有4个核函数,其中一个是线性核,当使用线性核时,SVM就是Linear SVM,其实就是一个线性分类器,而LR也是一 ...

  3. 深入理解Java String类(综合)

    在Java语言了中,所有类似“ABC”的字面值,都是String类的实例:String类位于java.lang包下,是Java语言的核心类,提供了字符串的比较.查找.截取.大小写转换等操作:Java语 ...

  4. 为啥百度、网易、小米都用Python?Python的用途是什么?

      Python是一门脚本语言.由于能将其他各种编程语言写的模块粘接在一起,也被称作胶水语言.强大的包容性.强悍的功能和应用的广泛性使其受到越来越多的关注,想起一句老话:你若盛开.蝴蝶自来. 假设你感 ...

  5. ubuntu上Android开发环境及依赖项

    [时间:2018-07] [状态:Open] [关键词:ubuntu,系统安装,开发环境搭建,android,工具集] Ubuntu系统版本:v18.04 LTS c/c++ dev (build-e ...

  6. 【Java】的四种引用的区别

    强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止.如果想中断强引用和某个对象之间的 ...

  7. Sqlmap 中绕过空格拦截的12个脚本

  8. golang字符串拼接

    四种拼接方案: 1,直接用 += 操作符, 直接将多个字符串拼接. 最直观的方法, 不过当数据量非常大时用这种拼接访求是非常低效的. 2,直接用 + 操作符,这个和+=其实一个意思了. 3,用字符串切 ...

  9. Java多线程系列——计数器 CountDownLatch

    简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await(). ...

  10. 【hbase】Unable to read additional data from client sessionid 0x15c92bd1fca0003, likely client has closed socket

    启动hbase ,验证出错 Master is initializing 查看zk日志,发现Unable to read additional data from client sessionid 0 ...