HotSpot和OpenJDK入门

1、HotSpot And OpenJDK And OracleJDK And JER区别 学习java前我们先了解下这几个词的区别,HotSpot、JDK、JRE、OpenJDK、Oracle JDK 一、HotSpot HotSpot是JVM(Java Virtual Machine),是一个运行Java字节码的虚拟机,具有语言无关性和平台无关性。平台无关性:我们java编写的程序可以运行在window、mac、Linux上就是HotSpot的平台无关性。 语言无关性:比如Java、kotlin、Scala、Clojure、Groovy、Jython、JRuby、Ceylon、Eta、Ha 阅读详情

在本文中,我们将会介绍如何开始使用HotSpot Java虚拟机以及它在OpenJDK开源项目中的实现——我们将会从两个方面进行介绍,分别是虚拟机和虚拟机与Java类库的交互。

HotSpot源码介绍

首先让我们看看JDK源码和它所包含的相关Java概念的实现。检查源码的方式主要有两种:

  • 现代IDE能够附加src.zip(在$JAVA_HOME目录),能够从IDE中访问
  • 使用OpenJDK的源码并导航到文件系统

这两种方式都非常有用,但是重要的是哪种方式比较舒适一点。OpenJDK的源码存储在Mercurial(一个分布式的版本控制系统,与流行的Git版本控制系统相似)中。如果你不熟悉Mercurial,可以查看这本名为“版本控制示例”的免费书,该书介绍了相关的基础内容。

为了检出OpenJDK 7的源码,你需要安装Mercurial命令行工具,然后执行以下命令:

hg clone http://hg.openjdk.java.net/jdk7/jdk7 jdk7_tl

该命令会在本地生成一个OpenJDK仓库的副本。该仓库含有项目的基础布局,但是并没有包含所有的文件——因为OpenJDK项目分别分布在几个子仓库中。

完成克隆之后,本地仓库应该有类似于下面的内容:

ariel-2:jdk7_tl boxcat$ ls -l
total 664
-rw-r--r--  1 boxcat staff   1503 14 May 12:54 ASSEMBLY_EXCEPTION
-rw-r--r--  1 boxcat staff  19263 14 May 12:54 LICENSE
-rw-r--r--  1 boxcat staff  16341 14 May 12:54 Makefile
-rw-r--r--  1 boxcat staff   1808 14 May 12:54 README
-rw-r--r--  1 boxcat staff 110836 14 May 12:54 README-builds.html
-rw-r--r--  1 boxcat staff 172135 14 May 12:54 THIRD_PARTY_README
drwxr-xr-x 12 boxcat staff    408 14 May 12:54 corba
-rwxr-xr-x  1 boxcat staff   1367 14 May 12:54 get_source.sh
drwxr-xr-x 14 boxcat staff    476 14 May 12:55 hotspot
drwxr-xr-x 19 boxcat staff    646 14 May 12:54 jaxp
drwxr-xr-x 19 boxcat staff    646 14 May 12:55 jaxws
drwxr-xr-x 13 boxcat staff    442 16 May 16:01 jdk
drwxr-xr-x 13 boxcat staff    442 14 May 12:55 langtools
drwxr-xr-x 18 boxcat staff    612 14 May 12:54 make
drwxr-xr-x  3boxcat staff    102 14 May 12:54 test

接下来,你应该运行get_source.sh脚本,该脚本是初始克隆内容的一部分。该脚本会填充项目的剩余部分,克隆构建OpenJDK所需要的所有文件。

在我们深入并详细地介绍源码之前,我们必须要有“不惧怕平台源码”的信念。开发者通常会认为JDK源码一定是令人振奋且难以接近的,但这毕竟是整个平台的核心。

JDK源码是固定的、经过良好的审核和测试的,但是并不是那么无法接近。特别是这些源码并不是始终包含Java语言的最新特性。所以我们经常会在其内部找到那些依然没有泛型化的、使用原始类型的类。

对于JDK源码而言,有几个主要的仓库是你应该熟悉的:

jdk

这是类库存在的地方。几乎所有的内容都是Java(本地方法会使用一些C代码)。这是深入学习OpenJDK源码的一个非常好的起点。JDK的类在jdk/src/share/classes目录中。

hotspot

HotSpot虚拟机——这里面是C/C++和汇编代码(还有一些基于Java的虚拟机开发工具)。这些内容非常高级,如果你并不是一个专业的C/C++开发人员那么这些内容会让人有一点难以入手。稍后我们会更加详细地讨论一些入门的好方法。

langtools

对于那些对编译器和工具开发感兴趣的人而言,可以从这里找到语言和平台工具。大部分是Java和C代码——学习这些内容比学习JDK代码要难,但是对于大多数开发者而言还是可以接受的。

还有一些其他的仓库,但是它们可能没有那么重要或者对大多数开发者而言没什么吸引力,这些仓库包括corba、jaxp和jaxws等内容。

构建OpenJDK

Oracle最近开始了一个项目对OpenJDK做了一次全面的修整,并且简化了构建过程。这个项目称为“build-dev”,目前该项目已经完成并且成为了构建OpenJDK的标准方式。对于很多使用基于Unix系统的用户而言,构建过程现在就和安装一个编译器和一个“引导JDK”然后运行三个命令那么简单:

./configure
make clean
make images

如果你想获取更多与构建自己的OpenSDK相关的信息,那么AdoptOpenJDK计划(由伦敦的Java社团创建)是一个不错的起点——这是一个由100多位草根开发者组成的社团,他们都工作在警告清理、小bug解决和OpenJDK 8对主要开源项目的兼容性测试等项目上。

理解HotSpot运行时环境

Java运行时环境正如OpenJDK所提供的那样,由HotSpot JVM和类库(大部分都捆绑到了rt.jar里面)组成。

因为Java是一个可移植的环境,所有需要调用操作系统的内容最终都会由一个本地方法处理。另外,还有一些方法需要JVM的特殊处理(例如类的加载)。这些内容也会通过一个本地调用移交给JVM。

例如,让我们看看原始Object类中本地方法的C代码。Object类的本地源码包含在jdk/src/share/native/java/lang/Object.c文件中,它有六个方法。

Java本地接口(JNI)通常会要求本地方法的C实现按照一种非常特别的方式命名。例如,本地方法Object::getClass()使用通用的命名约定,因此C实现被包含在一个具有如下签名的C函数中:

Java_java_lang_Object_getClass(JNIEnv *env, jobject this)

JNI还有另一种加载本地方法的方式,java.lang.Object类中剩余的5个本地方法就使用了这种方式:

static JNINativeMethod methods[] = {
     {"hashCode",     "()I",     (void *)&JVM_IHashCode},
     {"wait",         "(J)V",    (void *)&JVM_MonitorWait},     
     {"notify",       "()V",     (void *)&JVM_MonitorNotify},     
     {"notifyAll",    "()V",     (void *)&JVM_MonitorNotifyAll},            
     {"clone",        "()Ljava/lang/Object;", (void *)&JVM_Clone},};

这5个方法被映射到了JVM的入口点(它们是通过在C方法名上使用JVM_前缀来指定的),——使用registerNatives()的方式(开发人员能够通过这种方式改变Java本地方法到C函数名称的映射)。

Java运行时环境是用Java编写的,仅有很少的与JVM相关的小地方不是。除了代码的执行之外,JVM的主要工作是运行时环境的内务处理和维护,这里是活动Java对象运行时表示赖以生存的地方——Java堆。

OOP和KlassOOP

堆中的任何Java对象都是由一个普通的对象指针(OOP)表示的。在C/C++中一个OOP是一个真正的指针——一个指向Java堆里面某个内存位置的机器字。在JVM进程的虚拟地址空间中,会为Java堆分配一个单独的连续的地址范围,然后用户空间中的这块内存就会完全由JVM进程自己管理,直到JVM因为某些原因需要调整堆大小为止。

这意味着Java对象的创建和收集并不会牵扯到分配和释放内存的系统调用。

一个OOP由两个机器字头组成,它们被称为Mark和Klass字,之后是这个实例的成员字段。对于数组而言,在成员字段之前还有一个额外的字头——数组的长度。

之后我们会更加详细地介绍Mark和Klass字,但是它们的名字也暗示了一些内容——Mark字用于垃圾收集(用于标记——扫描的标记部分),而Klass字则是一个指向类元数据的指针。

在OOP头之后,实例字段会按照它在字节码中的特定顺序进行排列。如果你想了解更精确的细节,可以阅读NitsanWakart的博客文章“理解Java对象的内存分布”。

基本字段和引用字段都会排列在OOP头后面——当然,对象的引用也是OOP。下面让我们看一个Entry类(java.util.HashMap类中使用了该类)的例子:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;

// methods...

} 

现在,让我们来计算一下一个Entry对象的大小(在32位的JVM上)。

头包含一个Mark字和一个Klass字,因此在32位的HotSpot上OOP头会占用8个字节(在64位HotSpot上占用16个字节)。

一个OOP定义的总体大小是2个机器字加上所有实例字段的大小。

引用类型的字段实际上是指针——在所有健全的处理器架构中该指针都将占用一个机器字。

因此,因为我们有一个int字段,两个引用字段(对类型为K和V的对象的引用)和一个Entry字段,所以整个大小为2个字(头)+1个字(int)+3个字(指针)。

存储一个HashMap.Entry对象总共需要24个字节(6个字)。

KlassOOP

Klass字是OOP头中最重要的部分之一。它是指向这个类元数据的指针(它由一个称为KlassOOP的C++类型表示)。在这些元数据当中最重要的是这个类的方法,它们被表示为一个C++虚拟方法表(一个“vtable”)。

我们并不想让所有的实例都携带着方法的所有细节,因为这样做效率会非常低,所以使用了一个vtable在实例之间共享这些信息。

需要注意的是,KlassOOP和类加载操作所产生的类对象是不同的。这两者之间的区别可以概括为下面两个方面:

  • Class对象(例如String.class)仅仅是普通的Java对象——它们和任何其他的Java对象(实例OOP)一样都是OOP,和所有其他的对象那样拥有同样的行为,同时它们也能够被放入Java变量中。
  • KlassOOP是类元数据的JVM表示——它们通过一个vtable结构携带类的方法信息。我们不能直接从Java代码中获得到KlassOOP的引用——它们存在于堆的Permgen区域。

记住这个区别最容易的方式是,将KlassOOP当作是类对象的JVM级别的“镜像”。

虚拟调度

KlassOOP的vtable结构直接与Java的方法调度和单继承相关。要记住,默认情况下Java的实例方法调度是虚拟的(它使用被调用实例对象的运行时类型信息查找方法)。

在KlassOOPvtable中这是通过“常量vtable偏移”实现的。这意味着,重载方法在vtable中的偏移和它所重载的父类(包括祖父等)中的方法实现具有相同的偏移。

在这种情况下虚拟调度就很容易实现了,只需要简单地追溯继承层次(按照类——父类——祖父类的层次追溯)并寻找方法的实现就可以了(在vtable中的偏移始终相同)。

例如,这意味着在所有的类中toString()方法在vtable中的偏移始终相同。这个vtable结构有助于单继承,同时在使用JIT编译代码的时候也能够做一些非常好的优化。

(单击图片放大)

OOP头的Mark字是一个到某个结构的指针(实际上仅仅是一个位字段的集合,它们保存着OOP相关的内部处理信息)。

在常见的32位JVM环境中,Mark结构的位字段类似于下面的内容(查看hotspot/src/share/vm/oops/markOop.hpp了解更多内容):

hash:25 —>| age:4 biased_lock:1 lock:2

高25位包含对象的hashCode()值,紧接着的4位是对象的年龄(存活对象所经过的垃圾收集的次数)。剩下的3个位用于表明对象的同步锁状态。

Java 5引入了一种新的对象同步方式,称为偏向锁(在Java 6中是默认的锁机制)。该方案的灵感来源于对对象运行时行为的观察——在很多情况下对象永远只会被一个线程锁定。

在偏向锁中,一个对象会“偏向于”锁定它的第一个线程——然后这个线程会实现更好的锁性能。获得偏向的线程会被记录在Mark头中。

JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2

如果另一个线程试图锁定对象,那么这个偏向就会被取消(并且不会被重新获得),并且自此之后所有的线程都必须明确地锁定和解锁对象。

对象的状态可能会是:

  • 未锁定
  • 偏向的
  • 轻量级锁定
  • 重量级锁定
  • 标记的(仅在垃圾收集期间有效)

HotSpot源码中的OOP

HotSpot源中相关的OOP类型层次非常复杂。这些类型被保存在hotspot/src/share/vm/oops中,包括:

  • oop (抽象基础)
  • instanceOop (实例对象)
  • methodOop (方法表示)
  • arrayOop (数组抽象基础)
  • symbolOop (内部符号/字符串类)
  • klassOop
  • markOop

有一些稍微奇怪的历史性事件——虚拟调度表(vtable)的内容和klassOOP是分开保存的,markOOP和其他OOP看起来完全不同,但是它依然包含在同样的层次中。

一个非常有趣的地方是,我们可以从jmap命令行工具中直接看到OOP。它对堆中的内容做了一个快照,包括出现在permgen中的所有OOP(包括子类和KlassOOP所需的支持结构)。

$ jmap -histo 150 | head -18 
num #instances #bytes class name 
---------------------------------------------- 
1: 10555 21650048 [I 
2: 272357 6536568 java.lang.Double 
3: 25163  5670768 [Ljava.lang.Object; 
4: 229099 5498376 com.jclarity.censum.dataset.CensumXYDataItem 
5: 39021  5470944 <constMethodKlass> 
6: 39021  5319320 <methodKlass> 
7: 8269   4031248 [B 
8: 3161   3855136 <constantPoolKlass> 
9: 119759 2874216 org.jfree.data.xy.XYDataItem 
10: 3161  2773120 <instanceKlassKlass> 
11: 2894  2451648 <constantPoolCacheKlass> 
12: 34012 2271576 [C 
13: 87065 2089560 java.lang.Long 
14: 20897 2006112 [Lcom.jclarity.censum.CollectionType; 
15: 33798 1081536 java.util.HashMap$Entry 

尖括号中的条目包含了各种类型的OOP,例如[I和[B分别指int类型和byte类型的数组。

HotSpot解释器

开发者通常会比较熟悉那种“在一个while循环中切换”的解释器,但是HotSpot比这种类型的解释器要更加先进。

HotSpot是一个模板解释器。这意味着它会构建一个动态的、优化的机器码调度表——特定于用户所使用的操作系统和CPU。大部分的字节码指令都是使用汇编语言代码实现的,仅有非常复杂的指令会被委托给虚拟机处理,例如从一个类文件的常量池中查找一个入口。

这提升了HotSpot解释器的性能,但是代价是难以将虚拟机移植到新的架构和操作系统上。同是对于新开发者而言也增加了他们理解解释器的难度。

对于新手开发者而言,对OpenJDK所提供的运行时环境有一个基础的理解是非常必要的:

  • 环境中的大部分都是使用Java编写的
  • 通过本地方法实现操作系统的可移植性
  • 堆中的Java对象由OOP表示
  • JVM中的类元数据用KlassOOP表示
  • 有一个先进的高性能模板解释器,哪怕是解释执行模式下的性能

到现在为止,开发者已经能够开始探索JDK仓库中的Java代码了,也能够尝试着积累自己的C/C++和汇编知识去深入学习HotSpot了。


主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE 市面上可供选择的JVM发行版还是有不少的。选择合适的JVM需要考虑不同的因素。性能是其中一个重要的因素。靠谱的性能研究是很困难的。在本文中,我创建了一个测试,在不同的JVM上执行对比测试。测试程序包括Spring Boot REST应用,使用Prometheus监控JVM并使用Grafana可视化。下图是示意图。除了soapui外,所有东西都在docker容器中运行。如何确定没有别的因素干扰你的设施。我们可以通过尝试隔离分配给流程的资源来实现。例如,分配专用CPU和固定数量的内存。 阅读详情

相关推荐

JVM--01--JVM 体系结构、HotSpot

JVM--01--JVM 体系结构、HotSpot

m0_46671240的博客 684

HotSpot And OpenJDK

1. HotSpot HotSpot是JVM(Java Virtual Machine),是一个运行Java字节码的虚拟机。 HotSpot包括: 一个Java ClassLoader 一个Java字节码解释器 Client和Server模式的虚拟机,针对不同用途做优化 一些垃圾回收器 一组运行时库 为什么叫HotSpot? 因为这款虚拟机当...

6606

Gatling + MAVEN 做性能测试(一)项目搭建

准备工作 1. Java Version: 64bits OpenJDK8 or OpenJDK11 with HotSpot https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2. Build Tool: Maven 3.6.3 or higher https://maven.apache.org/download.cgi 3. 开发工具: IntelliJ(社区版) ...

bai___DDD的博客 515

终于搞清楚了:OpenJDK和Sun/Oracle JDK和hotspot什么关系

历史上的原因是,OpenJDK是JDK的开放原始码版本,OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。 把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是开源

当我谈编程时我谈些什么 9569

openJDK 与 Hotspot对应关系

<br />链接地址:https://gist.github.com/925323<br /> <br />由于某些原因,我贴在这里,供自己参考。Correspondence between Sun/Oracle JDK, OpenJDK and HotSpot VM versionsbuild dateSun/Oracle JDK VersionOpenJDK VersionHotSpot VM Version2006-11-291.6.0-b1051.6.0-b1052007-03-141.6.0_01

aliveTime的专栏 5685

OpenJDK1.8 HotSpot编译报错

报错信息:/usr/bin/make: invalid option -- '8' /usr/bin/make: invalid option -- '/' /usr/bin/make: invalid option -- 'a' /usr/bin/make: invalid option -- '/' /usr/bin/make: invalid option -- 'c' Usage: mak...

m0_37325106的博客 2843

jdk8和hotspot_HotSpot和OpenJDK入门

在本文中,我们将从虚拟机(VM)的角度以及与之交互的角度研究如何开始在HotSpot Java虚拟机上工作以及如何在OpenJDK开源项目中实现它。 Java类库。 HotSpot来源简介 让我们看一下JDK源代码以及其中包含的Java概念的实现。 检查源代码有两种主要方法: 现代IDE可以附加src.zip(来自$ JAVA_HOME),以允许从IDE进行访问,或者 使用O...

cunfu6353的博客 3667

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 447

openJDK_HotSpot源码下载

​ 最近在研究多线程的内容,在看Java源码的时候有很多是调用native的本地方法,就想着下载一下Hotspot源码从而能更深入的了解一下底层原理。好了废话不多说,下面介绍一下Hotspot源码下载方法。 1、登录 打开openjdk官网:http://hg.openjdk.java.net ,选择要下载的版本,本文以jdk8为例。 2、选择jdk版本 从上图中选择jdk8,点击进去 openjdk —— corba:不流行的多语言、分布式通讯接口 —— hotspot:Java 虚拟机 —— jax

qq_33996921的博客 2349

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

自动化革命:AI在需求分析、代码生成与测试中的深度应用

在2025年的科技浪潮中,人工智能(AI)已不再是实验室中的概念,而是深度渗透至软件开发的全生命周期。从需求分析的精准捕捉,到代码生成的自动化创作,再到测试环节的智能覆盖,AI正以革命性姿态重塑软件工程的核心环节。本文将结合2025年最新数据与行业实践,解析AI如何在这三大领域实现深度应用。

1510

OpenJDK新手教程之编译HotSpot

前言 讲OpenJDK/HotSpot编译的文章比较多了,玩Linux的朋友自是不在话下,Windows下的也有那么几篇: 《深入理解Java虚拟机》作者周志明的《自己动手编译Windows版的OpenJDK 7》(http://icyfenix.iteye.com/blog/1097344...

795

Rancher操作手册(v2.7.5-rc1)

选择需要创建ingress的命名空间 ==》填写ingress名称 ==》在“规则”一栏,选择“Prefix” ==》输入访问路径 ==》选择访问路径对应的service ==》如果需要继续添加访问路径,点击“添加路径”,重复前面的步骤即可。选择需要创建Deployment的命名空间 ==》填写Deployment名称 ==》选择通用 ==》填写容器名称 ==》填写镜像 ==》选择镜像的拉取密文 ==》点击添加端口或Service。点击左侧菜单栏的集群里的“项目/命名空间”,点击右下角的“创建命名空间”。

weixin_60197334的博客 5569

openjdk 是什么vm_什么准时!! OpenJDK HotSpot VM的剖析

openjdk 是什么vm 重要要点 应用程序可以选择适当的JIT编译器来产生接近机器级别的性能优化。 分层编译包含五个级别的编译。 分层编译可提供出色的启动性能,并指导进一步编译级别以提供高性能优化。 JVM开关提供有关JIT编译的诊断信息。 诸如本征和向量化之类的优化进一步提高了性能。 OpenJDK HotSpot Java虚拟机(俗称Java VM或JVM...

cunfu6353的博客 1943

AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事?

AXI总线的transaction是burst-based的,因此有必要好好研究一下不同burst type的工作原理。此处略过burst的定义以及burst size、burst length等信号的介绍。

qiuzhongyu123的博客 2万+

LPDDR4 JEDEC标准测试实例解析--写操作

LPDDR4的JEDEC标准一致性测试项详解以及实例分享,满满干货!感兴趣的小伙伴可以持续关注!!

一只豌豆象的博客 7774

在Linux下编译OpenJdk并调试Hotspot

背景 对于大多数Java程序员来说,JVM就是一个黑盒子,我们一般不必关心它内部是怎么运作的。但是万一碰到JVM bug导致的Crash呢,又或者只是因为好奇想了解JVM的内部世界,那么就需要编译和调试JVM。 概念 1. JVM(Java Virtual Machine)        翻译过来就是Java虚拟机,所谓虚拟机是相对传统的计算机而言的。

7009

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

从openJDK官网下载Hotspot 源码

讲了下载java8对于的JVM源码,jvm源码中只有.h的头文件,并没有.cpp的具体实现文件。还需要下载hotspot源码。4.选择hotspot,点击进入新界面。选择browse,点击进入新界面。

知道这个有什么用? 3165

YOLOv5 自定义模型 Android 部署完整指南

本文详细介绍了将YOLOv5模型部署到Android设备的完整流程,包含三个核心部分:首先验证官方模型测试,确保基础环境配置正确;随后进行模型转换,从PyTorch导出ONNX格式并优化,再转换为NCNN格式;最后在Android项目中集成自定义模型,包括文件替换、参数修改和代码适配。教程基于YOLOv5 6.1版本,使用NCNN框架进行移动端推理,涵盖了常见问题解决方案和关键配置要点,为开发者提供了从训练到部署的完整技术路线。

FJN110的博客 591

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Hotspot】clion调试 openjdk

ubuntu20比较新, 编译openjdk8需要安装老版本的编译工具。在编译 openjdk 时还需要一个 jdk 环境用以引导。1.下载oracle-jdk8。2.下载openjdk8源码。配置多版本gcc控制。

这个人很懒什么都没有~ 931

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

编译openjdk并debug hotspot

简单记录一下编译openjdk并debug hotspot的过程 1:yum install mercurial #安装mercurial(一种类似git的仓库客户端工具) 2:hg clone http://hg.openjdk.java.net/jdk8u/jdk8u openjdk8 #下载 jdk8u相关文件 (我这里下载的是jdk8u不是jdk8) 3:cd openjdk8 & sh get_source.sh #下载源码 4:yum install java-1.7.0-o

E_K_in的博客 1088

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM 和 HotSpot 的区别?

一个Java虚拟机(JVM)是从未被物理建成硬件假想计算机。JVM 运行编译成其虚构指令集的程序,该指令集作为称为字节码的中间表示写入存储。 在运行时,字节码必须从虚构的指令集转换为主机 CPU 的实际指令集。这可以由口译员即时完成。或者字节码可以被完全编译和缓存,以比通过解释器运行得更快,在一个称为即时 (JIT) 编译的过程中。 几十年来,有许多JVM 的实现。大多数都已经消失了。 HotSpot是 JIT 技术的一种实现,它从运行解释开始,并观察应用程序的实际性能。然后选择应用程序的某些部分作为本机代

鸭梨的博客 4426

Mac编译OpenJDK7(8)和Eclipse调试Hotspot

一、前言 Java是我主要的生产语言,但对JVM不是很了解,最近也在看《深入理解Java虚拟机 第二版》,所以想亲手编译OpenJDK和调试HotSpot虚拟机系统是15年的Mac OS X(10.11.5),而OpenJDK7却是13的,完全按照书本来,肯定是编译不过的,本文记录了在这个痛苦过程中遇到的坑,希望对其他人能有所帮助OpenJDK8使用configure && make

Ydoing的专栏 3740
上一篇: 浅析Java虚拟机结构与机制
下一篇: Linux与JVM的内存关系分析
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值