jvm

JVM基础——类加载器与双亲委派模型

那年仲夏 提交于 2020-03-18 02:18:43
一、前言   这是 JVM 系列博客的第五篇,也是最后一篇,写完这篇博客,我就要暂时停止对 JVM 的学习,开始学习其他方面的内容了。这篇博客就来说一说 JVM 中的类加载器,以及类加载的双亲委派模型。 二、正文  2.1 什么是类加载器   首先我们要知道一件事,那就是什么是类加载器?大家都知道,我们编写的代码需要先被编译为 class 字节码才能被执行, JVM 解释器只能识别字节码,而不能执行 Java 源代码。而程序都是在内存中执行的,所以,为了能够执行字节码,就需要将它读取到内存中。将字节码读取到内存中这个工作,就是由类加载器来完成的。类加载器根据提供的全限定类名(包名+类名),找到对应路径下的类的 class 文件,将其读取到 JVM 管理的方法区中,这样才能执行其中的代码指令,访问类中的数据。关于类加载机制,可以参考这篇博客: JVM基础——分析类的加载过程 。   对于类加载器,需要注意一个问题。每一个类都是由它本身和类加载器一同来确定唯一性。这是什么意思?这就是说, 如果一个类的字节码,分别使用两个不同的类加载器进行加载,则对于JVM来说,会将这两次加载识别为不同的两个类 。举个例子,我们有一个类 Test ,创建了一个自定义的类加载器去加载它,并通过自定义的类加载器得到的 Class 对象创建 Test 对象 t (反射),此时运行 t instanceof

JVM实现线程

十年热恋 提交于 2020-03-17 18:35:23
实现线程主要有三种方式:使用内核线程实现,使用用户线程实现和使用用户线程加轻量级进程混合实现。 使用内核线程实现 内核线程(KLT,Kernel-Level Thread),直接由操作系统内核(Kernel,即内核)支持的线程。由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核叫做多线程内核。 程序一般不会去直接使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(LWP),即通常意义上的线程*。由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。*轻量级进程与内核线程之间1:1关系称为一对一的线程模型。 内核线程保证了每个轻量级进程都成为一个独立的调度单元,即时有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程的继续工作。 局限:基于内核线程实现,因此各线程操作等需要系统调用,系统调用代价高,需要在用户态和内核态来回切换,其次,每个轻量级进程都需要一个内核线程的支持,因此轻量级进程要消耗一定的内核资源,如内核线程的栈空间,因此一个系统支持轻量级进程的数量是有限的。 使用用户线程实现 广义上,内核线程以外,就是用户线程。轻量级也算用户线程,但轻量级进程的实现始终是建立在内核上的

Eclipse的最佳JVM设置是什么? [关闭]

那年仲夏 提交于 2020-03-17 18:07:23
某厂面试归来,发现自己落伍了!>>> 按照目前的情况,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。 如果您认为此问题可以解决并且可以重新提出, 请访问帮助中心 以获取指导。 7年前 关闭。 已锁定 。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 了解更多 。 您发现运行Eclipse的最佳JVM设置是什么? #1楼 如果要使用jdk6 update 14,建议使用G1垃圾收集器,这似乎对性能有所帮助。 为此,请删除以下设置: -XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode -XX:+ CMSIncrementalPacing 并将它们替换为: -XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC #2楼 Eclipse Galileo 3.5和3.5.1设置 当前(2009年11月),我正在使用jdk6 update 17测试以下配置选项集(使用Galileo-eclipse 3.5.x, 对于 Helios 3.6.x ,请参见 下面的3.4 或 更高版本 ): (当然,请使eclipse.ini中存在的相对路径适合您的设置的正确路径) 注意:对于

JVM性能优化概念

╄→尐↘猪︶ㄣ 提交于 2020-03-17 15:34:25
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用类型包括:类类型,接口类型和数组。堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享

将OpenJ9 JVM用于Quarkus应用程序

跟風遠走 提交于 2020-03-17 14:44:24
在本文中,请参阅如何对Quarkus应用程序使用OpenJ9 JVM,并查看内存使用情况结果。抽丝剥茧 细说架构那些事——【优锐课】 根据主页上的定义,Quarkus是“为OpenJDK HotSpot和GraalVM量身定制的Kubernetes本机Java堆栈”。由于我是OpenJ9的忠实拥护者,因此我快速测量了我的反应性示例应用程序的内存使用情况,在其中我使用OpenJ9和HotSpot运行一次微服务。 OpenJ9是Java JVM,它是2-3年前从IBM开源的。它与IBM在数百种产品和产品中使用的JVM基本相同。令人高兴的是,与Hotspot相比,它不仅启动时间缩短了42%,而且内存占用空间减少了66%。查看文档。 我使用了AdoptOpenJDK中的OpenJ9,你可以在HotSpot和OpenJ9之间进行选择。阅读我以前的博客,以了解AdoptOpenJDK提供的其他优势。 内存使用结果 这是我的小测试结果。该图来自Quarkus网站。橙色的所有内容都是我为OpenJ9添加的内容。 我运行了相同的服务,该服务使用OpenJ9和HotSpot访问数据库。我从头开始部署了该服务的两个版本,并通过调用它们的REST API对其进行了预热。之后,我调用了“ docker stats | grep文章有效”。热点显示为149.8MiB,OpenJ9显示为59.77MiB。

【JVM】02-深入理解类加载器

假如想象 提交于 2020-03-17 12:16:40
类加载器的作用 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这 个类的java.lang.Class对象,作为方法区类数据的访问入口。 类缓存 标准的Java SE类加载器可以按要求查找类,但- -旦某个类被加载到类加载器中,它将维持加载(缓存) - -段时间。不过, JVM垃圾收集器可以回收这些Class对象。 类加载器的层次结构(树状结构) 引导类加载器( bootstrap class loader ) -它用来加载Java的核心库(JAVA_ _HOME/jre/lib/rt.jar,或sun.boot.class.path路径下的内容) ,是用原生代码来实现的,并不继承自java.lang.ClassLoader. -加载扩展类和应用程序类加载器。并指定他们的父类加载器。 扩展类加载器( extensions class loader ) -用来加载Java的扩展库(JAVA_ .HOME/jre/ext/*.jar ,或java.ext.dirs路径下的内容)。 Java虚拟机的实现会提供一个扩 展库目录。该类加载器在此目录里面查找并加载Java类。 应用程序类加载器( application class loader ) -它根据Java应用的类路径( classpath,java.class.path

JVM笔记《四》七个常见的垃圾收集器

人盡茶涼 提交于 2020-03-17 09:20:19
目录 垃圾收集器 一、 Serial (新生代) 二、 ParNew(新生代) 三、 Parallel Scanvenge(新生代) 相关参数 四、 Parallel Old(老年代) 五、 Serial Old(老年代) 六、 CMS(老年代) 运作过程 缺点 总结 七、 Garbage First(G1) 几个问题 运行过程 特色和优点: 缺点(与CMS比) JVM笔记(一)java内存区域与内存溢出以及对象的创建、布局和定位 JVM笔记(二)对象的生死与java的四大引用 JVM笔记(三)垃圾收集算法以及HotSpot的算法实现(安全点、记忆集与卡表、写屏障、三色标记等) 垃圾收集器 一、 Serial (新生代) 1. 单线程 (收集期间需要暂停其他所有线程) 2. 客户端模式下的默认收集器,也是很好的选择 优点: 1.简单高效(与其他收集器的单线程相比) 2.内存资源受限时,额外内存消耗最小 3.因为没有线程交互的开销,因此可获得最高的单线程效率 二、 ParNew(新生代) 是Serial的多线程版本。 多线程并行收集,其余与Serial相同 多线程并行收集 (用户进程需等待) 目前唯一一个能 与CMS收集器配合 工作 使用 -XX:+UseConcMarkSweepGC 参数,使用 ParNew+CMS+Serial Old 收集器组合

Java内存模型

非 Y 不嫁゛ 提交于 2020-03-17 08:59:43
Java内存模型 原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文 档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多。一个开发Java的开发者,一旦了解了 JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知: silentbalanceyh@126.com , 本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些知识,为草案。因为平时开发的时候没有特殊情况 不会进行内存管理,所以有可能有笔误的地方比较多,我用的是Windows平台,所以本文涉及到的与操作系统相关的只是仅仅局限于Windows平台。不 仅仅如此,这一个章节牵涉到的多线程和另外一些内容并没有讲到,这里主要是结合JVM内部特性把本章节作为核心的概念性章节来讲解,这样方便初学者深入以 及彻底理解Java语言) 本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介    i.内存模型概述   Java平台自动集成了 线程 以及 多处理器技术 ,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对 多种异构平台的平台独立性

Synchronizing a Method Across JVM's

天大地大妈咪最大 提交于 2020-03-17 08:45:09
问题 How does one go about synchronizing a method across JVM's? My example is a web application that restricts a user name from being logged in more than once (in other words, the first user can log on, but if another user signs on with the same user name, he gets rejected). The web application is deployed across multiple servers, so there are multiple JVM's, and users can be attempting to sign on using different servers, depending on the load balancer. Here's how the method looks public

Flink总结-设置Jvm参数

佐手、 提交于 2020-03-17 08:32:24
jvm设置 http://www.360doc.com/content/12/1023/16/9615799_243296263.shtml 堆设置 -Xms :初始堆大小 -Xmx :最大堆大小 -XX:NewSize=n :设置年轻代大小 -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 -XX:MaxPermSize=n :设置持久代大小 收集器设置 -XX:+UseSerialGC :设置串行收集器 -XX:+UseParallelGC :设置并行收集器 -XX:+UseParalledlOldGC :设置并行年老代收集器 -XX:+UseConcMarkSweepGC :设置并发收集器 垃圾回收统计信息 -XX:+PrintHeapAtGC GC的heap详情 -XX:+PrintGCDetails GC详情 -XX:+PrintGCTimeStamps 打印GC时间信息 -XX:+PrintTenuringDistribution 打印年龄信息等 -XX: