jrockit

虚拟机的前世今生和Java内存区域

蹲街弑〆低调 提交于 2020-07-28 20:02:43
Java程序执行过程 javac编译成.class文件,然后jvm将其加载到方法区,执行引擎将会执行这些字节码,执行时会翻译成操作系统相关函数,jvm作为.class文件的翻译存在,输入字节码,调用操作系统函数。 过程如下:Java文件->编译器->字节码->jvm->机器码。 JVM、JRE、JDK的关系 JVM充当翻译的角色,把class翻译成机器识别的代码。 JRE包含jvm,还提供很多类库(也就是jar包,比如读取或者操作文件,连接网络,使用IO等)JVM标准加上实现的一大堆基础类库,组成java运行时环境。 JDK:负责编译代码,调试代码,打包代码,有时候还需要反编译代码,jdk提供了一些非常nice的工具,比如javac(编译代码),java -jar打包代码,javap反汇编等 JVM的作用是:从软件层面屏蔽不同操作系统在底层硬件和指令的不同。 同时JVM是一个虚拟化的操作系统,类似Linux或者Windos的操作系统,只是它架在操作系统上,接收字节码也就是class,把字节码翻译成操作系统上的机器码进行执行。 JVM的发展 常见的Hotspot虚拟机,Jrocket,J9,TaobaoVM等 JVM整体知识模块 JVM能涉及非常庞大的一块知识体系,比如内存结构、垃圾回收、类加载、性能调优、JVM自身优化技术、执行引擎、类文件结构、监控工具等。 但是所有的知识体系这

Java系列:JVM中的OopMap(zz)

萝らか妹 提交于 2020-07-28 18:45:41
调用栈里的引用类型数据是GC的根集合(root set)的重要组成部分;找出栈上的引用是GC的根枚举(root enumeration)中不可或缺的一环。 JVM选择用什么方式会影响到GC的实现: 如果JVM选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到底应该解读为引用类型还是整型还是别的什么。这种条件下,实现出来的GC就会是“保守式GC(conservative GC)” 。在进行GC的时候,JVM开始从一些已知位置(例如说JVM栈)开始扫描内存,扫描的时候每看到一个数字就看看它“像不像是一个指向GC堆中的指针”。这里会涉及上下边界检查(GC堆的上下界是已知的)、对齐检查(通常分配空间的时候会有对齐要求,假如说是4字节对齐,那么不能被4整除的数字就肯定不是指针),之类的。然后递归的这么扫描出去。 保守式GC的好处是相对来说实现简单些,而且可以方便的用在对GC没有特别支持的编程语言里提供自动内存管理功能。Boehm-Demers-Weiser GC是保守式GC中的典型代表,可以嵌入到C或C++等语言写的程序中。 小历史故事: 微软的JScript和早期版VBScript也是用保守式GC的;微软的JVM也是。VBScript后来改回用引用计数了。而微软JVM的后代,也就是.NET里的CLR,则改用了完全准确式GC。 为了赶上在一个会议上发布消息

java堆内存又溢出了,教你一招必杀技

妖精的绣舞 提交于 2020-05-07 18:41:09
JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。 年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。 堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。 非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。 在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。 元空间有注意有两个参数: MetaspaceSize :初始化元空间大小,控制发生GC阈值 MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存 为什么移除永久代? 移除永久代原因:为融合HotSpot JVM与JRockit VM(新JVM技术)而做出的改变

这一次,终于系统的学习了 JVM 内存结构

∥☆過路亽.° 提交于 2020-04-18 10:01:12
最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最佳实践 》、《 Java虚拟机规范 Java SE 8版 》这两本书中关于 JVM 内存结构的部分都看了一遍,算是对 JVM 内存结构有了新的认识。JVM 内存结构是指:Java 虚拟机定义了若干种程序运行期间会使用的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁,另一些则与线程一一对应,随着线程的开始而创建,随着线程的结束而销毁。具体的运行时数据区如下图所示: 在 Java 虚拟机规范中,定义了五种运行时数据区,分别是 Java 堆、方法区、虚拟机栈、本地方法区、程序计数器,其中 Java 堆和方法区是线程共享的。接下来就具体看看这 五种运行时数据区。 Java 堆(Heap) Java 堆是所有线程共享的一块内存区域,它在虚拟机启动时 就会被创建,并且单个 JVM 进程有且仅有一个 Java 堆。Java 堆是用来存放对象实例及数组,也就是说我们代码中通过 new 关键字 new 出来的对象都存放在这里。所以这里也就成为了垃圾回收器的主要活动营地了,于是它就有了一个别名叫做

运行时数据区域

浪尽此生 提交于 2020-03-16 18:28:31
某厂面试归来,发现自己落伍了!>>> Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示。 1. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址

003. 深入JVM学习—Java堆内存模型

南笙酒味 提交于 2020-02-29 14:36:24
1. GC收集原理 对不需要的对象进行处理标记,而后进行清除。 2. JVM堆内存划分 JDK1.8 以前 JDK1.8 以后 在JDK1.8之后将最初的永久代内存空间取消,取消永久代的目的是为了将HotSpot和JRockit两个虚拟机标准联合为一个(只有HotSpot有永久代)。 在整个JVM堆内存之中实际上将内存分为了三块: 年轻代:新对象和没达到一定年龄的对象都在年轻代。 老年代:被长时间使用的对象,内存空间应该要比年轻代更大。 元空间:像一些方法中的操作临时对象等,直接使用物理内存。 最初的永久代是需要在JVM堆内存里面进行划分。 来源: oschina 链接: https://my.oschina.net/u/3142084/blog/1833985

浅谈JVM

走远了吗. 提交于 2019-12-20 18:33:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 回顾java程序执行流程 如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。 根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 名称 特征 作用 配置参数 异常 程序计数器 占用内存小,线程私有,生命周期与线程相同 大致为字节码行号指示器 无 无 虚拟机栈 线程私有,生命周期与线程相同,使用连续的内存空间 Java 方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息 -Xss StackOverflowError/OutOfMemoryError 堆 线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址 保存对象实例,所有对象实例(包括数组)都要在堆上分配 -Xms -Xsx -Xmn OutOfMemoryError 方法区

永久代和元空间(Metaspace)

。_饼干妹妹 提交于 2019-12-17 21:08:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> PermGen(永久代) JVM 规范的一种实现 只有 HotSpot 才有 “PermGen space”, 方法区: 是JVM的一种规范,存放类信息、常量、静态变量、即时编译器编译后的代码等; 永久代: 是HotSpot的一种具体实现,实际指的就是方法区, 元空间(Metaspace) 本质和永久代类似,都是 对JVM规范 中 方法区 的 实现 。 不过元空间与永久代之间最大的区别在于: 元空间并不在虚拟机中 ,而是使用 本地内存 。 因此,默认情况下,元空间的大小仅受本地内存限制, 但可以通过以下参数来指定元空间的大小: -XX:MetaspaceSize,初始空间大小, -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。 -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比 -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比 JDK 8 中永久代向元空间的转换,几点原因: 1、字符串存在永久代中,容易出现性能问题和内存溢出。 2、类及方法的信息等比较难确定其大小, 因此对于永久代的大小指定比较困难, 太小容易出现永久代溢出, 太大则容易导致老年代溢出。 3、永久代会为

Java8内存模型—永久代(PermGen)和元空间(Metaspace)

三世轮回 提交于 2019-12-17 20:48:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、JVM 内存模型   根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个恒定的值,我们通过下面这段程序可以测试一下这个结果: 栈溢出测试源码: package com.paddx.test.memory; public class StackErrorMock { private static int index = 1 ; public void call(){ index++; call(); } public static void main(String[] args) { StackErrorMock mock = new StackErrorMock(); try { mock.call(); } catch (Throwable e){ System.out.println( "Stack deep : "

Where to download JRockit for Java 7?

China☆狼群 提交于 2019-12-12 11:33:31
问题 I tried http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html but all I get is The content on this page is no longer available but your downloads may be found on the Oracle Java Archive page. 回答1: See Java 7 Questions & Answers (circa 2011): Q: When will JRockit be available for Java 7? A: It won't. As we explained last year we are merging JRockit and HotSpot into one single JVM. JDK 7 contains the first release of this converged JVM, where one of the first steps was to