【Java虚拟机八 分析Java堆】教程文章相关的互联网学习教程文章

实战java虚拟机(二)——垃圾回收算法

前言垃圾回收是Java体系最重要的组成部分之一,和C/C++不同,Java虚拟机提供了全自动的内存管理方案,尽量减少了我们在内存资源管理方面的工作量,但是这套方案也并不完美,因此我们也需要深入学习垃圾回收的算法,在工作中遇到内存溢出等问题时也容易更快找到问题所在 一、引用计数法引用计数法是最古老的垃圾收集算法,它的实现非常简单,只需要为每个对象配备一个整型计数器即可,当对象被引用时,计数器+1,引用失效时计数器-1...

Java虚拟机03----垃圾收集器及GC参数【图】

本文主要内容:-》堆的回顾-》各种垃圾收集器的介绍1. 串行收集器2. 并行收集器3. CMS收集器4. G1收集器 堆的回顾:新生代中的98%对象都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间...

【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构

我为什么喜欢Java,另重要原因就是跨平台,就是WORA。  程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机。?Tip  Java生态中的语言有很多,处理Java本身还有Scala、Groovy和Jruby。然而虚拟机只管跟底层操作系统打交道,对上层它只认字节码。那么跟各种语言打交道的就是翻译家—编译器。字节码的载体就是.class文件。  字节码,是以8个字节为单位的二进制文件,整个文件中排列紧凑,从头到尾不含一...

Java虚拟机结构及常见内存溢出异常【代码】【图】

每个Java虚拟机都有一个类加载器子系统,根据某个全限定名来装入类型,同样每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令。 当虚拟机运行一个程序时,就需要从已加载的文件中得到信息,将这些信息组织到运行时数据区,以便于管理。Java运行时的数据区域划分 1、程序计数器:程序计数器是一块较小的内存空间,可以看做是当前线程的字节码的行号指示器。 Java虚拟机的多线程是通过线程轮流切换并分...

JAVA虚拟机栈

JAVA虚拟机栈几个重要概念java 虚拟机栈 = java virtual machine stacks = jvms1、JVMS 线程私有,生命周期与线程相同2、JVMS 描述的是JAVA方法执行的内存模型:JVMS在方法执行时会创建一个“栈帧” stack frame,用于记录局部变量表、操作数栈、动态链接、方法出口等,每一个方法从调用到完成的过程,就是一个栈帧在JVMS中入栈到出栈的过程3、局部变量表存放基本数据类型、对象引用、returnAddress(字节码指令地址),long 和 do...

Java虚拟机的意义【图】

什么是Java虚拟机?作为程序员,大家都知道写的代码都是在Java虚拟机上运行的,但大家是否知道,Java虚拟机又是什么呢?先看看网上搜到有关JAVA虚拟机的介绍 :虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字...

深入理解Java虚拟机-垃圾收集算法【代码】【图】

一、判断对象是否可进行回收1.引用计数算法  给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。但是主流的Java虚拟机里面没有选用引用计数算法来管理内存,最主要的原因是它很难解决对象之间相互循环引用的问题。代码示例如下:publicclass JVMTest {private JVMTest jvmTest = null;publicstaticvoid main(String[] args) {JVM...

了解java虚拟机—堆相关参数设置(3)【图】

堆相关配置-Xmx最大堆空间-Xms初始堆空间大小,如果初始堆空间耗尽,JVM会对堆空间扩容,其扩展上限为最大堆空间。通常-Xms与-Xmx设置为同样大小,避免扩容造成性能损耗。-Xmn设置新生代大小,设置一个较大的新生代会减少老年代的大小,新生代的大小一般设置为整个堆空间的1/3 或者1/4。-XX:SurvivorRatio设置新生代中eden空间和from/to空间的比例关系。-XX:SurvivorRatio=eden/from=eden/to例如:-Xmx20m -Xms20m –Xmn1m –XX:Su...

《深入理解JAVA虚拟机》JDK的垃圾收集算法

概念垃圾收集是很多使用JAVA语言的IT从业者了解得比较少的地方。但是涉及性能时非常重要。大公司面试除了算法,这部分也是会经常考察的地方。《深入理解JAVA虚拟机》一书中讲到JVM的垃圾收集算法和垃圾收集器。 垃圾收集算法分为:1、标记清除算法通常用在回收老年代内存。最早的搜集算法就是标记清除(Mark-Sweep)算法了。其原理是分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。...

《深入理解 Java 虚拟机》读书笔记:Java 内存模型与线程【图】

正文由于计算机的处理器运算速度与它的存储和通信子系统速度的差距太大了,大量的时间都花费在磁盘 I/O、网络通信或者数据库访问上,导致处理器在大部分时间里都处于等待其他资源的状态。因此,为了充分利用计算机的处理器运算能力,现代计算机操作系统采用了多任务处理的方式,即让计算机并发处理多个任务。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然就会越高;反之,线程之间频繁阻塞甚至死锁,将会大大降低...

java虚拟机的内存问题

虚拟机占内存的问题 我们可以使用Runtime类来查看一个java程序运行时虚拟机的状态。 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 应用程序不能创建自己的 Runtime 类实例。我们需要手动创建。其中getRuntime()中有三个方法,如下: totalMemory() 返回 Java 虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这取决于主机环境。 注意...

继上一篇的Java虚拟机部分的内容接着写,上一篇讲的是有关类加载的,这一篇我写写垃圾回收相关算法,理念吧,【图】

上一篇的引子《Java类加载》想要看类加载的内容可以看一看。一、对象存活算法首先我们要回收一个对象,首先得知道这个对象是不是存活。如果对象存活则不能够继续回收,如果是已经死亡的对象,则应该立即回收。首先我们要想确定一个类是不是存活,一般来说有两个方法比较成熟。1,引用计数法  当有一个引用指向一个对象时,这个对象的引用个数加1.当一个对象的引用个数是1的时候,就可以判断这个对象将不再使用,或者说是一个死亡...

java虚拟机字节码执行引擎浅析【图】

执行引擎是java虚拟机的核心组成部分之一。 我们知道,javac编译器完成了程序代码经过词法分析、语法分析到抽象语法树、再遍历语法树生成线性的字节码指令流的过程。而字节码文件再经过加载、验证、准备、解析、初始化等阶段才能被使用。字节码执行引擎正是执行了这样的过程:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。运行时栈帧结构: 栈帧(stack frame)是用于支持虚拟机进行方法调用和方法执...

《深入理解Java虚拟机》第二部分(7)【代码】

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,从大方向上将,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃...

《深入Java虚拟机》笔记【图】

当运行一个Java程序的同时,也就在运行了一个Java虚拟机实例。Java虚拟机实例通过调用某个初始类的mian()方法来运行一个Java程序运行中Java程序的每一个线程都是一个独立的虚拟机执行引擎的实例。虚拟机实例都有一个方法区和一个堆,它们是由该虚拟机实例中所有线程共享的。当每个线程被创建时,它都将得到它自己的PC寄存器已经一个Java栈。Java以栈为中西设计指令集,而非以寄存器为中心,使得多平台体系结构容易实现虚拟机。原文...