精华内容
下载资源
问答
  • http://yangshangchuan.iteye.com/blog/2012401首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换:Java代码 收藏代码/***生成机器码的接口,不同...获取机器码* @return 机器码*/public String ...

    http://yangshangchuan.iteye.com/blog/2012401

    首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换:

    Java代码  收藏代码

    /**

    *生成机器码的接口,不同平台有不同实现

    * @author 杨尚川

    */

    public interface SequenceService {

    /**

    * 获取机器码

    * @return  机器码

    */

    public String getSequence();

    }

    其次,定义了一个抽象类,实现了一些通用的功能,如生成MD5摘要、将很长的字符串以固定的位数分割开,以便于人类阅读(如将机器码 71F5DA7F495E7F706D47F3E63DC6349A 每4个一组,以-分割为71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A)、利用sigar来生成机器码。这里需要在pom.xml中加入sigar依赖。

    Xml代码  收藏代码

    org.fusesource

    sigar

    1.6.4

    log4j

    log4j

    Java代码  收藏代码

    import org.apdplat.module.system.service.PropertyHolder;

    import org.apdplat.platform.log.APDPlatLogger;

    import org.apdplat.platform.util.ConvertUtils;

    import org.apdplat.platform.util.FileUtils;

    import java.io.File;

    import java.io.UnsupportedEncodingException;

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    import java.util.HashSet;

    import java.util.Properties;

    import java.util.Set;

    import org.apdplat.platform.log.APDPlatLoggerFactory;

    import org.hyperic.sigar.Mem;

    import org.hyperic.sigar.NetFlags;

    import org.hyperic.sigar.NetInterfaceConfig;

    import org.hyperic.sigar.Sigar;

    /**

    *机器码生成的通用服务

    * @author 杨尚川

    */

    public abstract class AbstractSequenceService   implements SequenceService{

    protected final APDPlatLogger LOG = APDPlatLoggerFactory.getAPDPlatLogger(getClass());

    /**

    * 对一段String生成MD5摘要信息

    * @param message 要摘要的String

    * @return 生成的MD5摘要信息

    */

    protected String getMD5(String message) {

    message += "{apdplat}";

    try {

    MessageDigest md = MessageDigest.getInstance("MD5");

    LOG.debug("MD5摘要长度:" + md.getDigestLength());

    byte[] b = md.digest(message.getBytes("utf-8"));

    String md5 = ConvertUtils.byte2HexString(b)+message.length();

    return getSplitString(md5);

    } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {

    LOG.error("MD5摘要失败",e);

    }

    return null;

    }

    /**

    * 将很长的字符串以固定的位数分割开,以便于人类阅读

    * @param str

    * @return

    */

    protected String getSplitString(String str){

    return getSplitString(str, "-", 4);

    }

    /**

    * 将很长的字符串以固定的位数分割开,以便于人类阅读

    * 如将

    * 71F5DA7F495E7F706D47F3E63DC6349A

    * 以-,每4个一组,则分割为

    * 71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A

    * @param str 字符串

    * @param split 分隔符

    * @param length 长度

    * @return

    */

    protected String getSplitString(String str, String split, int length){

    int len=str.length();

    StringBuilder temp=new StringBuilder();

    for(int i=0;i

    if(i%length==0 && i>0){

    temp.append(split);

    }

    temp.append(str.charAt(i));

    }

    String[] attrs=temp.toString().split(split);

    StringBuilder finalMachineCode=new StringBuilder();

    for(String attr : attrs){

    if(attr.length()==length){

    finalMachineCode.append(attr).append(split);

    }

    }

    String result=finalMachineCode.toString().substring(0, finalMachineCode.toString().length()-1);

    return result;

    }

    /**

    * 利用sigar来生成机器码,当然这个实现不是很好,无法获得CPU ID,希望有兴趣的朋友来改进这个实现

    * @param osName 操作系统类型

    * @return 机器码

    */

    protected String getSigarSequence(String osName) {

    try {

    File libFile = new File(FileUtils.getAbsolutePath("/WEB-INF/lib/"+PropertyHolder.getProperty("libsigar."+osName)));

    LOG.debug("libsigar."+osName+" : "+libFile.getAbsolutePath());

    System.load(libFile.getAbsolutePath());

    Set result = new HashSet<>();

    Sigar sigar = new Sigar();

    String[] ifaces = sigar.getNetInterfaceList();

    for (String iface : ifaces) {

    NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(iface);                if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0

    || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {

    continue;

    }

    String mac = cfg.getHwaddr();

    result.add(mac);

    LOG.debug("mac: " + mac);

    }

    if(result.size()<1){

    return null;

    }

    Properties props = System.getProperties();

    String javaVersion = props.getProperty("java.version");

    result.add(javaVersion);

    LOG.debug("Java的运行环境版本:    " + javaVersion);

    String javaVMVersion = props.getProperty("java.vm.version");

    result.add(javaVMVersion);

    LOG.debug("Java的虚拟机实现版本:    " + props.getProperty("java.vm.version"));

    String osVersion = props.getProperty("os.version");

    result.add(osVersion);

    LOG.debug("操作系统的版本:    " + props.getProperty("os.version"));

    Mem mem = sigar.getMem();

    // 内存总量

    String totalMem = mem.getTotal() / 1024L + "K av";

    LOG.debug("内存总量:    " + totalMem);

    result.add(totalMem);

    LOG.debug("result:    " + result);

    String machineCode = getMD5(result.toString());

    return machineCode;

    } catch (Throwable ex) {

    LOG.error("生成 "+osName+" 平台下的机器码失败", ex);

    }

    return null;

    }

    }

    最后,我们分别看看不同平台的实现。

    Windows:

    Java代码  收藏代码

    /**

    *在Windows平台上生成机器码

    * @author 杨尚川

    */

    public final class WindowsSequenceService extends AbstractSequenceService{

    @Override

    public String getSequence() {

    String cpuID=getCPUSerial();

    String hdID=getHDSerial("C");

    if(cpuID==null || hdID==null){

    return null;

    }

    String machineCode = getMD5(cpuID+hdID);

    return machineCode;

    }

    /**

    *

    * @param drive 硬盘驱动器分区 如C,D

    * @return 该分区的卷标

    */

    private String getHDSerial(String drive) {

    StringBuilder result = new StringBuilder();

    try {

    File file = File.createTempFile("tmp", ".vbs");

    file.deleteOnExit();

    try (FileWriter fw = new java.io.FileWriter(file)) {

    String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"

    + "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"

    + "Wscript.Echo objDrive.SerialNumber";

    fw.write(vbs);

    }

    Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());

    try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

    String line;

    while ((line = input.readLine()) != null) {

    result.append(line);

    }

    }

    file.delete();

    } catch (Throwable e) {

    LOG.error("生成HDSerial失败", e);

    }

    if (result.length() < 1) {

    LOG.info("无磁盘ID被读取");

    }

    return result.toString();

    }

    /**

    * 获取CPU号,多CPU时,只取第一个

    * @return

    */

    private String getCPUSerial() {

    StringBuilder result = new StringBuilder();

    try {

    File file = File.createTempFile("tmp", ".vbs");

    file.deleteOnExit();

    try (FileWriter fw = new FileWriter(file)) {

    String vbs = "On Error Resume Next \r\n\r\n" + "strComputer = \".\"  \r\n"

    + "Set objWMIService = GetObject(\"winmgmts:\" _ \r\n"

    + "    & \"{impersonationLevel=impersonate}!\\\\\" & strComputer & \"\\root\\cimv2\") \r\n"

    + "Set colItems = objWMIService.ExecQuery(\"Select * from Win32_Processor\")  \r\n "

    + "For Each objItem in colItems\r\n " + "    Wscript.Echo objItem.ProcessorId  \r\n "

    + "    exit for  ' do the first cpu only! \r\n" + "Next                    ";

    fw.write(vbs);

    }

    Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());

    try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

    String line;

    while ((line = input.readLine()) != null) {

    result.append(line);

    }

    }

    file.delete();

    } catch (Throwable e) {

    LOG.error("生成CPUSerial失败", e);

    }

    if (result.length() < 1) {

    LOG.info("无CPU_ID被读取");

    }

    return result.toString();

    }

    public static void main(String[] args) {

    SequenceService s = new WindowsSequenceService();

    String seq = s.getSequence();

    System.out.println(seq);

    }

    }

    Linux:

    Java代码  收藏代码

    /**

    *在Linux平台上生成机器码

    * @author 杨尚川

    */

    public class LinuxSequenceService  extends AbstractSequenceService{

    @Override

    public String getSequence() {

    return getSigarSequence("linux");

    }

    public static void main(String[] args) {

    SequenceService s = new LinuxSequenceService();

    String seq = s.getSequence();

    System.out.println(seq);

    }

    }

    Mac OS X:

    Java代码  收藏代码

    /**

    *在Mac OS X平台上生成机器码

    * @author 杨尚川

    */

    public class MacSequenceService    extends AbstractSequenceService{

    @Override

    public String getSequence() {

    return getSigarSequence("mac");

    }

    public static void main(String[] args) {

    SequenceService s = new MacSequenceService();

    String seq = s.getSequence();

    System.out.println(seq);

    }

    }

    Solaris:

    Java代码  收藏代码

    /**

    *在Solaris平台上生成机器码

    * @author 杨尚川

    */

    public class SolarisSequenceService    extends AbstractSequenceService{

    @Override

    public String getSequence() {

    return getSigarSequence("solaris");

    }

    public static void main(String[] args) {

    SequenceService s = new SolarisSequenceService();

    String seq = s.getSequence();

    System.out.println(seq);

    }

    }

    已有 0 人发表留言,猛击->> 这里<

    ITeye推荐

    展开全文
  • 编译器可以分为:前端编译器、JIT编译器和AOT编译器前端编译器:代码到字节在JDK安装目录中有一个Javac工具,就是它将Java代码翻译成字节,这个工具叫做编译器,相对于其他编译器,因为处于编译前期,因此被称为...

    2f17addbc42d53e43e437af77595efa5.png

    编译器可以分为:前端编译器、JIT编译器和AOT编译器

    99e16dbcc2104eb896f1dc2a00f41b37.png

    前端编译器:代码到字节码

    在JDK安装目录中有一个Javac工具,就是它将Java代码翻译成字节码,这个工具叫做编译器,相对于其他编译器,因为处于编译前期,因此被称为前端编译器。

    d9307393e196c12adb5b68ada0a296ea.png

    通过javac编译器,我们可以很方便的将java源文件,翻译成字节码文件,就拿我们熟悉的Hello World为例:

    public class Demo{
       public static void main(String args[]){
    		System.out.println("Hello World!");
       }
    }

    使用javac编译命令编译上面这个类,便会生成一个Demo.class文件。

    > javac Demo.java
    > ls 
    Demo.java Demo.class

    然后使用纯文本编译器打开Demo.class文件,我们发现是一连串的16进制二进制流。

    9210786d06fc4bc7db9716f33d710329.png

    我们运行javac命令的过程,其实就是javac编译器解析Java源代码,并生成字节码文件的过程,javac编译器的处理过程可以分为下面四个阶段:

    第一个阶段:词法、语法分析、这个阶段,JVM会对源码的字符进行一次扫描,最终生成一个抽象的语法树,在这阶段JVM会弄明白我们的代码到底想要做什么,比如就像我们分析句子,对句子进行划分主谓宾,弄清楚表达的含义。

    第二个阶段:填充符号表。我们知道类之间是会互相引用的,在编译阶段,我们无法确定其具体的地址,所以我们会使用一个符号来替代,在这个阶段做的就是类似的事情,即对抽象的类或接口进行符号填充。等到类加载阶段,JVM会将符号替换成具体的内存地址。

    第三个阶段:注解处理。java是支持注解的,在这个阶段会对注解进行分析,根据注解的作用将其还原成具体的指令集。

    第四个阶段:分析与字节码生成,到了这个阶段,JVM便会根据上面几个阶段分析出来的结果,进行字节码生成,最终会输出class文件。

    javac被称为前端编译器,是因为发生在整个编译的前期,常见的前端编译器有Sun的 javac、Eclipse JDT的增量式编译器(ECJ)。

    JIT编译器:从字节码到机器码

    源代码转换成字节码之后,要运行程序,有两种选择。一种是使用Java解释器解释执行字节码,另一种则是使用JIT编译器将字节码转化为本地机器码。

    这两种方式的区别在于,前者启动速度快但运行速度慢,后者启动速度慢但运行速度快,原因是因为解释器不需要像JIT编译器一样,将所有字节码都转化为机器码,自然就少去了优化时间。而当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,再次可以直接使用,机器码的运行效率肯定是高于Java解释器,所以在实际情况中,通常是使用两种结合的方式进行Java代码的编译执行。

    7522d3f567c505e61d74fc2d650b1c7d.png

    在HotSpot虚拟机内置了两个即时编译器,分为称为 Client Compiler 和 Server Copiler。这两种不同的编译器衍生出两种不同的编译模式,分为称为:C1编译模式,C2编译模式。

    注意:现在许多人习惯上将 Client Compiler 称为 C1 编译器,将 Server Compiler 称为 C2 编译器,但在 Oracle 官方文档中将其描述为 compiler mode(编译模式)。所以说 C1 编译器、C2 编译器只是我们自己的习惯性称呼,并不是官方的说法。这点需要特别注意。

    f0f8b0c82ce187f22ac43332999f34e4.png

    C1编译模式会将字节码编译为本地代码,进行简单、可靠的优化,如果必要加入性能监控的逻辑。而C2编译模式,也是将字节码编译为本地代码,但是会启用一些编译消耗时间较长。

    简单的说C1编译模式做的优化相对于保守,其编译速度相比C2较快,而C2编译模式会做一些激进的优化,并且会根据性能监控做针对性的优化,所以编译质量更高,但是时间更长。

    对于C1和C2如何选择

    实际上对于HotSpot虚拟机来说,一共有三种运行模式可选:

    1. 混合模式(Mixed Mode),即C1和C2两种模式混合使用,,这个是默认的运行模式,如果想要单独使用C1或者C2,使用-Client 或者 -server就可以打开。
    2. 解释模式(Interpreted Mode)所有代码都要解释执行,使 用 -Xint 参数可以打开这个模式。
    3. 编译模式(Compiled Mode)此模式优先采用编译,但是无法编译时候也会解释执行,使用 -Xcomp 打开这种模式。

    在命令行中输入 java -version 可以看到运行模式:

    f58b8adfaf2a0cab558bb6166217be71.png

    AOT编译器:源代码到机器码

    AOT编译器的基本思想是,在程序执行之前生成Java方法的本地代码,程序运行的时候直接使用本地代码。

    Java语言本身的动态特性会引起一些额外的复杂性,影响Java静态编译的质量,例如:Java语言中的动态类加载,因为AOT是在程序运行前编译的,所以无法获取这一个情况,会导致一些错误。

    AOT编译器从编译质量看是肯定比不上JIT的编译器,其存在的目的是避免JIT编译器运行时性能消耗或内存消耗,避免解释程序早期的性能开销。

    从运行速度上来说,AOT编译器编译出来的代码比JIT编译出来的慢,但是比解释执行的快,编译时间上,AOT也是一个始终的速度,所以说,AOT编译器的存在是JVM牺牲质量换取性能的一种策略方法,就如JVM其运行模式选择Mixed混合模式一样,使用C1编译模式只进行简单的优化,而C2编译模式则进行较为激进的优化,利用这两点,达到最优的运行效率。

    总结:

    在JVM中有三个非常重要的编译器,它们分别是:前端编译器、JIT编译器、AOT编译器。

    前端编译器,最常见的就是我们的javac编译器,其将Java源代码编译为Java字节码文件,JIT即时编译器,最常见的是HotSpot 虚拟机中的Client Compiler 和 Server Compiler ,其将Java字节码编译为本地机器代码,而AOT编译器则能将源代码直接编译为本地机器码,这三种编译器的速度和质量如下:

    • 编译速度上:解释执行 > AOT编译器 > JIT编译器
    • 编译质量上:JIT编译器 > AOT编译器 > 解释执行

    而在JVM中,通过这几种不同方式的配合,使得JVM编译质量和运行速度达到最优的状态。

    展开全文
  • JAVA通过JNI获取机器码

    2010-10-25 23:02:44
    谁能提供一下获取机器码(CPU序列号,MAC地址,硬盘序列号)的DLL动态链接库啊!谢谢 邮箱:291144929@qq.com
  • 用于生成机器码感觉用mac不靠谱,因为mac能改,(除CPU序列号外,还可以获得主板序列号。)publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtry{longstart=System.currentTimeMillis();Process...

    用于生成机器码

    感觉用mac不靠谱,因为mac能改,

    (除CPU序列号外,还可以获得主板序列号。)

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    try {

    long start = System.currentTimeMillis();

    Process process = Runtime.getRuntime().exec(

    new String[] { "wmic", "cpu", "get", "ProcessorId" });

    process.getOutputStream().close();

    Scanner sc = new Scanner(process.getInputStream());

    String property = sc.next();

    String serial = sc.next();

    System.out.println(property + ": " + serial);

    System.out.println("time:" + (System.currentTimeMillis() - start));

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    ProcessorId: BFEBFBFF00030***

    time:291

    再用MD5加密下就成机器码了,不加密也行。

    展开全文
  • 前言作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机,做了一下总结,希望...运行时创建对象方法调用,执行引擎解释为机器码CPU执行指令多线程切换上下文编译我们都知道,jav...

    前言

    作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机,做了一下总结,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽。

    java 代码运行主要流程

    8ffa74487de473fa1902f7448518cd44.png

    本文主要讲解流程如下:

    • java源文件编译为class字节码

    • 类加载器把字节码加载到虚拟机的方法区。

    • 运行时创建对象

    • 方法调用,执行引擎解释为机器码

    • CPU执行指令

    • 多线程切换上下文

    编译

    我们都知道,java代码是运行在Java虚拟机上的。但是java是一门面向对象的高级语言,它不仅语法非常复杂,抽象程度也非常高,并不能直接运行在计算机硬件机器上。

    Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境。

    因此,在运行Java程序之前,需要编译器把代码编译成java虚拟机所能识别的指令程序,这就是Java字节码,即class文件。

    所以,Java代码运行的第一步是:把Java源代码编译成.class 字节码文件。5db5248be625c8aba596d3aceaeb11ea.png

    类加载

    在Class文件中描述的各种信息,需要被加载到虚拟机之后才能运行和使用。因此,需要把class字节码文件加载到Java虚拟机来。

    虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。

    加载

    加载阶段,虚拟机需要完成以下3件事情:

    • 通过一个类的全限定名来获取定义此类的二进制字节流。

    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

    加载阶段完成后,这些二进制字节流按照虚拟机所需的格式存储在方法区之中。

    9c23cfec328ec3e3c6b2ac877d6f8462.png

    验证

    为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机的安全,Java虚拟机对输入的字节流走验证过程。

    验证阶段包括四个阶段:文件格式验证、元数据验证、字节码验证、符号引用验证。0675c1341f9295894ff0cce7f9a60f28.png

    • 文件格式验证: 验证字节流是否符合Class文件格式规范,如:是否以魔数0xCAFEBABE开头。

    • 元数据验证: 对字节码描述的信息进行语义分析,如:这个类的父类是否继承了不允许被继承的类(被final修饰的类);

    • 字节码验证: 主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。如:保证跳转指令不会跳转到方法体以外的字节码指令上。

    • 符号引用验证: 发生在虚拟机将符号引用转化为直接引用的时候,如:校验符号引用中通过字符串描述的全限定名是否能找到对应的类。

    准备

    准备阶段是正式为类变量分配内存并设置类变量初始值,这些变量所使用的内存都将在方法区中进行分配。如:

    public static int value =123

    变量value在准备阶段过后的初始值是0而不是123。

    解析

    解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

    比如:com.User类引用com.Tool类,在编译时,User类不知道Tool类的实际内存地址,因此只能使用符号com.Tool(假设)来表示。而在类加载加载User类的时候,可以通过虚拟机获取Tool类的实际内存地址,因此便可以将符号com.Tool替换为Tool类的实际内存地址,即直接引用地址。

    解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行。

    初始化

    到了初始化阶段,才真正开始执行类中定义的Java字节码。在这个阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。

    创建对象

    Java虚拟机是如何执行字节码的呢?我们先来看一下运行时创建对象。

    Java是面向对象的编程语言,程序的运行是以对象为调用单位的。

    • 字节码文件加载到虚拟机的方法区后,在程序运行过程,通过 class字节码文件创建与其对应的对象信息 。

    • 创建对象的方式有:new关键字,反射等。

    • Java堆内存是线程共享的区域,创建后的对象信息就保存在Java堆内存中。

    dd8ad1e734a5d2074f469638ecd605a4.png

    方法调用

    JVM的调用单位是对象,但是真正执行功能性的代码还是对象上的方法。

    在运行过程中,每当调用进入一个java方法,java虚拟机会在当前线程的java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。方法栈内存是线程私有的,每个线程都有自己的方法栈。如果对应的方法是本地方法,则对应的就是本地方法栈。

    java运行时数据区域如下:45502a0bcf2123871b4301d4c73d5196.png

    解释

    当调用Java对象的某个方法时,JVM执行引擎会将该方法的字节码文件翻译成计算机所能识别的机器码,机器码信息保存在方法区中。翻译有解释执行和即时编译两种方式。

    6332db07c098d8ad573d61348b20f4a6.png两种翻译方式的区别如下:3c81c5af95f52a78be173574e4b9aa6a.png解释执行

    来一行代码,解释一行,大部分不常用的代码,都是采用这种方式。

    即使编译

    对于部分热点代码,将一个方法包含的所有字节码翻译成机器指令,以提高java虚拟机的运行效率。

    即时编译是建立经典的二八定律上,即20%代码占据了80%的计算资源。

    执行指令

    b76ee2612e23a1958161bfff7334e554.png

    • Java程序被加载入内存后,指令也在内存中了。

    • 指令的指令寄存器IP,指向下一条待执行指令的地址。

    • CPU的控制单元根据IP寄存器的指向,将主存中的指令装载到指令寄存器,这些加载的指令就是一串二进制码,还需要译码器进行解码。

    • 解码后,如果需要获取操作数,则从内存中取数据,调用运算单元进行计算。

    多线程上下文切换

    CPU一通上电,就会周而复始从内存中获取指令、译码、执行。ef74f61b8b9a48aa517e9b903cef9f60.png

    • 为了支持多任务,CPU 将执行时间这个资源划分成时间片,每个程序执行一段时间。

    • java虚拟机的多线程是通过线程轮流切换分配处理执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条程序中的指令。

    • 假设当前线程在运行中,CPU分配的时间执行完了,总得保存运行过的结果信息吧,要不然白白浪费之前的工作了,因此,程序计数器(PC寄存器)作用体现出来了,它是一块较小的内存空间,线程私有,可以看作当前线程执行的字节码的行号指示器。当CPU又给它分配时间跑的时候,可以把数据恢复,接着上一次执行到的位置继续执行就可以了。

    展开全文
  • java获取CPU序列号,生成机器码

    千次阅读 2019-01-18 14:17:32
    java获取CPU序列号,生成机器码
  • import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.InetAddress;import java.net.UnknownHostException;import java.text.ParseException;import java.ut...
  • 其存在的目的:为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler),简称 JIT 编译器。...
  • 其存在的目的:为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler),简称 JIT 编译器...
  • java百分百获取机器IP地址及MAC已测系统:windows linux unix排除127.0.0.1 和 0.0.0.0.1等非正常IPimport java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import ...
  • CPU序列号: ... import java.io.IOException;  import java.util.Scanner;    public class CPUTest {     /**   * @param args   * @throws IOException   */   ...
  • java获取mac和机器码,注册码的实现

    万次阅读 2014-11-25 17:01:32
    * java获取mac和机器码,注册码的实现 * */ public class AuthorizationUtils { private static final int SPLITLENGTH = 4; private static final String SALT = "yunshouhu"; public static void main...
  • java百分百获取机器IP地址及MAC 已测系统: windows linux unix 排除127.0.0.1 和 0.0.0.0.1等非正常IP import java.net.InetAddress; import java.net.NetworkInterface; import java.net....
  • 如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式。比如说可以在开发工具(IDEA、Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页(比如各种 OJ)中...
  • 扫描程序→获取源代码(几号形式)→语法分析(定义程序结构元素及其关系)→绘制语法树。 语义分析: 分析静态语义(声明和类型检查)→添加额外信息(“注释”或“装饰”到语法树,属性添加到符号表)。 代码...
  • Java获取IP地址及机器名称

    千次阅读 2013-01-15 18:13:46
    直接上: import java.net.*; public class GetIpTest{ public static void main(String[] args){ InetAddress addr=null; String ip=""; String address=""; try{ addr=InetAddress.getLocalHost()...
  • 1. 编译器 1.1 分类及说明前端编译器:把*.java文件转变为*.class文件Javac、ECJ后端运行期编译器(JIT编译器):把字节码(*.class文件)转变为机器码HotSpot的C1、C2静态提前编译器(AOT编译器):把*.java文件编译成本...
  • HashSet 是存在于 java.util 包中的类。同时也被称为集合,该容器中只能存储不重复的对象。对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以通过上篇文章对 HashMap 的学习后,学习 ...
  • java程序编写获取枪扫程序,并将扫枪扫有数据库MySQL数据进行对比预警,解决相关行业使用扫枪进行出货重复使用相关商品问题。该程序连接MySQL数据库,可同时部署到多台机器上进行设备比对。底层也实现...
  • 条形是一种可视化、机器可读的数据,这些数据通常描述了携带该条码的物品的...所需工具:free spire.barcode for java 1.3(免费版)intellij ideajar包文件导入:方式(一):首先,官网获取jar包step 1: 下载jar包...
  • 条形是一种可视化、机器可读的数据,这些数据通常描述了携带该条码的物品的...所需工具:Free Spire.Barcode for Java 1.3(免费版)Intellij IDEA Jar包文件导入:方式(一):首先,官网获取jar包Step 1: 下载Jar...
  • 我正在尝试远程连接到Windows机器并从该机器获取文件.这是我的代码,path = path.replace(":","");path = path.replace("\\","/");String smbpath="smb://"+host+":445/"+path; //c/alon2.txt";...
  • 但是这种方式获取的是服务端机器的信息。 举例来说,如果你使用的是Tomcat 的服务器, 那么, 以上方法获取的是Tomcat 所在机器的信息。 有的时候, 我们需要获取Web 客户端的一些信息, 用途可能是: 1. 记录Web...
  • 之前有用过Linux下一款"export"程序,可以实现交互式执行命令,但是不能保证在所有机器上运行,也无法动态的获取密码,因为它是要提前把密码写入脚本的。有没有人有个好的解决方案,我是用来Java Swing的GUI程序设计...
  • 因为此处用的菜刀是java的 所以你要搭建java环境 ...上传成功后可以在任何机器访问shell 如果我们想要知道数据库密码 先找到config目录 下面有一个文件叫config_global,打开它。里面就有密码 结束 ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 203
精华内容 81
关键字:

java机器码获取

java 订阅