手机版
热门标签
站点地图
我要投稿
广告合作
联系我们
搜 索
广告位招租
广告位招租
切换导航
首页
编程教程
编程导航
编程百科
编程问答
编程博文
编程实例
硬件设备
网络运营
软件教程
移动数码
办公软件
操作系统
人工智能
栏目导航
▸ 编程语言
▸ 前端开发
▸ 移动开发
▸ 开发工具
▸ 程序设计
▸ 行业应用
▸ CMS系统
▸ 服务器
▸ 数据库
公众号推荐
微信公众号搜
"智元新知"
关注
微信扫一扫可直接关注哦!
子栏目导航
Git
GitHub
SVN
Jenkins
Vim
vmware
Hyper-v
SSH
Jmeter
sysTemd
Maven
Webpack
Zookeeper
k8s
Phpstorm
JVM
IDEA
Appium
Cypress
pandas
Eclipse
HBuilder
编程工具
Markdown
Mac
Pytest
Selenium
istio
Gradle
Tensorflow
Homebrew
编程之家
JVM
Lisp是像JVM一样的虚拟机吗?
为什么有人会将Lisp称为像JVM这样的虚拟机? 可能是因为那个人指的是在虚拟机上运行的Lisp的特定实现?自70年代以来,各种Lisp系统一直在专用虚拟机上运行.一些当前的实现,如CLISP和CMUCL仍然有自己的虚拟机. Lisp的虚拟机通常是专门为Lisp的需求量身定制的.它们提供必要的原始数据类型(如cons单元,符号和大整数),指令集(泛型函数调用,运行时数据类型检查,…),内存管理(垃
作者:编程之家 时间:2020-01-16
强制64位jvm到32位jvm?
有人请给我关于强制64位jvm作为32位jvm运行的想法吗? 我需要编写一个用于蓝牙连接的jse桌面应用程序.为此我需要实现Bluecove jar.它只有32位文件.所以我在eclipse脉冲星的VM参数下包含了-D32.但是我仍然得到在添加参数之前显示的相同错误:bluecove_x64.dll缺失.我尝试使用-d32,它向我展示了“无法识别的选项:d32”. 似乎我应该安装一个可以在64位操
作者:编程之家 时间:2020-01-16
JVM内幕:Java虚拟机详解
这篇文章解释了Java 虚拟机(JVM)的内部架构。下图显示了遵守 Java SE 7 规范的典型的 JVM 核心内部组件。上图显示的组件分两个章节解释。第一章讨论针对每个线程创建的组件,第二章节讨论了线程无关组件。线程JVM 系统线程每个线程相关的程序计数器栈本地栈栈限制栈帧局部变量数组操作数栈动态链接线程共享堆内存管理非堆内存即时编译方法区类文件结构类加载器更快的类加载方法区在哪里类加载器参考运行时常量池异常表符号表Interned 字符串线程这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。run() 返回时,被处理未捕获异常,原生线程将确认由于它的结束是否要终止 JVM 进程(比如这个线程是最后一个非守护线程)。当线程结束时,会释放原生线程和 Java 线程的所有资源。JVM 系统线程如果使用 jconsole 或者其它调试器,你会看到很多线程在后台运行。这些后台线程与触发 public static void main(String[]) 函数的主线程以及主线程创建的其他线程一起运行。Hotspot JVM 后台运行的系统线程主要有下面几个:虚拟机线程(VM thread)这个线程等待 JVM 到达安全点操作出现。这些操作必须要在独立的线程里执行,因为当堆修改无法进行时,线程都需要 JVM 位于安全点。这些操作的类型有:stop-the-world 垃圾回收、线程栈 dump、线程暂停、线程偏向锁(biased locking)解除。周期性任务线程这线程负责定时器事件(也就是中断),用来调度周期性操作的执行。GC 线程这些线程支持 JVM 中不同的垃圾回收活动。编译器线程这些线程在运行时将字节码动态编译成本地平台相关的机器码。信号分发线程这个线程接收发送到 JVM 的信号并调用适当的 JVM 方法处理。线程相关组件每个运行的线程都包含下面这些组件:程序计数器(PC)PC 指当前指令(或操作码)的地址,本地指令除外。如果当前方法是 native 方法,那么PC 的值为 undefined。所有的 CPU 都有一个 PC,典型状态下,每执行一条指令 PC 都会自增,因此 PC 存储了指向下一条要被执行的指令地址。JVM 用 PC 来跟踪指令执行的位置,PC 将实际上是指向方法区(Method Area)的一个内存地址。栈(Stack)每个线程拥有自己的栈,栈包含每个方法执行的栈帧。栈是一个后进先出(LIFO)的数据结构,因此当前执行的方法在栈的顶部。每次方法调用时,一个新的栈帧创建并压栈到栈顶。当方法正常返回或抛出未捕获的异常时,栈帧就会出栈。除了栈帧的压栈和出栈,栈不能被直接操作。所以可以在堆上分配栈帧,并且不需要连续内存。Native栈并非所有的 JVM 实现都支持本地(native)方法,那些提供支持的 JVM 一般都会为每个线程创建本地方法栈。如果 JVM 用 C-linkage 模型实现 JNI(Java Native Invocation),那么本地栈就是一个 C 的栈。在这种情况下,本地方法栈的参数顺序、返回值和典型的 C 程序相同。本地方法一般来说可以(依赖 JVM 的实现)反过来调用 JVM 中的 Java 方法。这种 native 方法调用 Java 会发生在栈(一般是 Java 栈)上;线程将离开本地方法栈,并在 Java 栈上开辟一个新的栈帧。栈的限制栈可以是动态分配也可以固定大小。如果线程请求一个超过允许范围的空间,就会抛出一个StackOverflowError。如果线程需要一个新的栈帧,但是没有足够的内存可以分配,就会抛出一个 OutOfMemoryError。栈帧(Frame)每次方法调用都会新建一个新的栈帧并把它压栈到栈顶。当方法正常返回或者调用过程中抛出未捕获的异常时,栈帧将出栈。更多关于异常处理的细节,可以参考下面的异常信息表章节。每个栈帧包含:局部变量数组返回值操作数栈类当前方法的运行时常量池引用局部变量数组局部变量数组包含了方法执行过程中的所有变量,包括 this 引用、所有方法参数、其他局部变量。对于类方法(也就是静态方法),方法参数从下标 0 开始,对于对象方法,位置0保留为 this。有下面这些局部变量:booleanbytecharlongshortintfloatdoublereferencereturnAddress除了 long 和 double 类型以外,所有的变量类型都占用局部变量数组的一个位置。long 和 double 需要占用局部变量数组两个连续的位置,因为它们是 64 位双精度,其它类型都是 32 位单精度。操作数栈操作数栈在执行字节码指令过程中被用到,这种方式类似于原生 CPU 寄存器。大部分 JVM 字节码把时间花费在操作数栈的操作上:入栈、出栈、复制、交换、产生消费变量的操作。因此,局部变量数组和操作数栈之间的交换变量指令操作通过字节码频繁执行。比如,一个简单的变量初始化语句将产生两条跟操作数栈交互的字节码。int i;被编译成下面的字节码:0: iconst_0 // Push 0 to top of the operand stack1: istore_1 // Pop value from top of operand stack and store as local variable 1更多关于局部变量数组、操作数栈和运行时常量池之间交互的详细信息,可以在类文件结构部分找到。动态链接每个栈帧都有一个运行时常量池的引用。这个引用指向栈帧当前运行方法所在类的常量池。通过这个引用支持动态链接(dynamic linking)。C/C++ 代码一般被编译成对象文件,然后多个对象文件被链接到一起产生可执行文件或者 dll。在链接阶段,每个对象文件的符号引用被替换成了最终执行文件的相对偏移内存地址。在 Java中,链接阶段是运行时动态完成的。当 Java 类文件编译时,所有变量和方法的引用都被当做符号引用存储在这个类的常量池中。符号引用是一个逻辑引用,实际上并不指向物理内存地址。JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式。另外一种是符号引用在第一次使用的时候被解析,这种解析方式称为惰性方式。无论如何 ,JVM 必须要在第一次使用符号引用时完成解析并抛出可能发生的解析错误。绑定是将对象域、方法、类的符号引用替换为直接引用的过程。绑定只会发生一次。一旦绑定,符号引用会被完全替换。如果一个类的符号引用还没有被解析,那么就会载入这个类。每个直接引用都被存储为相对于存储结构(与运行时变量或方法的位置相关联的)偏移量。线程间共享堆堆被用来在运行时分配类实例、数组。不能在栈上存储数组和对象。因为栈帧被设计为创建以后无法调整大小。栈帧只存储指向堆中对象或数组的引用。与局部变量数组(每个栈帧中的)中的原始类型和引用类型不同,对象总是存储在堆上以便在方法结束时不会被移除。对象只能由垃圾回收器移除。为了支持垃圾回收机制,堆被分为了下面三个区域:新生代经常被分为 Eden 和 Survivor老年代永久代内存管理对象和数组永远不会显式回收,而是由垃圾回收器自动回收。通常,过程是这样的:新的对象和数组被创建并放入老年代。Minor垃圾回收将发生在新生代。依旧存活的对象将从 eden 区移到 survivor 区。Major垃圾回收一般会导致应用进程暂停,它将在三个区内移动对象。仍然存活的对象将被从新生代移动到老年代。每次进行老年代回收时也会进行永久代回收。它们之中任何一个变满时,都会进行回收。非堆内存非堆内存指的是那些逻辑上属于 JVM 一部分对象,但实际上不在堆上创建。非堆内存包括:永久代,包括:方法区驻留字符串(interned strings)代码缓存(Code Cache):用于编译和存储那些被 JIT 编译器编译成原生代码的方法。即时编译(JIT)Java 字节码是解释执行的,但是没有直接在 JVM 宿主执行原生代码快。为了提高性能,Oracle Hotspot 虚拟机会找到执行最频繁的字节码片段并把它们编译成原生机器码。编译出的原生机器码被存储在非堆内存的代码缓存中。通过这种方法,Hotspot 虚拟机将权衡下面两种时间消耗:将字节码编译成本地代码需要的额外时间和解释执行字节码消耗更多的时间。方法区方法区存储了每个类的信息,比如:Classloader 引用运行时常量池数值型常量字段引用方法引用属性字段数据针对每个字段的信息字段名类型修饰符属性(Attribute)方法数据每个方法方法名返回值类型参数类型(按顺序)修饰符属性方法代码每个方法字节码操作数栈大小局部变量大小局部变量表异常表每个异常处理器开始点结束点异常处理代码的程序计数器(PC)偏移量被捕获的异常类对应的常量池下标所有线程共享同一个方法区,因此访问方法区数据的和动态链接的进程必须线程安全。如果两个线程试图访问一个还未加载的类的字段或方法,必须只加载一次,而且两个线程必须等它加载完毕才能继续执行。类文件结构一个编译后的类文件包含下面的结构:ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info contant_pool[constant_pool_count – 1];u2 access_flags;u2 this_class;u2 super_class;u2 interfaces_count;u2 interfaces[interfaces_count];u2 fields_count;field_info fields[fields_count];u2 methods_count;method_info methods[methods_count];u2 attributes_count;attribute_info attributes[attributes_count];}Magic, minor_version, major_version类文件的版本信息和用于编译这个类的 JDK 版本。constant_pool类似于符号表,尽管它包含更多数据。下面有更多的详细描述。access_flags提供这个类的描述符列表。this_class提供这个类全名的常量池(constant_pool)索引,比如org/jamesdbloom/foo/Bar。super_class提供这个类的父类符号引用的常量池索引。interfaces指向常量池的索引数组,提供那些被实现的接口的符号引用。fields提供每个字段完整描述的常量池索引数组。methods指向constant_pool的索引数组,用于表示每个方法签名的完整描述。如果这个方法不是抽象方法也不是 native 方法,那么就会显示这个函数的字节码。attributes不同值的数组,表示这个类的附加信息,包括 RetentionPolicy.CLASS 和 RetentionPolicy.RUNTIME 注解。可以用 javap 查看编译后的 Java Class 文件字节码。如果你编译下面这个简单的类:package org.jvminternals;public class SimpleClass {public void sayHello() {System.out.println("He
作者:编程之家 时间:2019-03-22
JVM加载class文件的原理机制
在面试java工程师的时候,这道题经常被问到,故需特别注意。1、JVM 简介JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如Spring ,Hibernate 等等,再然后就开发企业级的应用,比如网站、企业内部应用、实时交易系统等等,直到某一天突然发现做的系统咋就这么慢呢,而且时不时还来个内存溢出什么的,今天是交易系统报了StackOverflowError ,明天是网站系统报了个OutOfMemoryError ,这种错误又很难重现,只有分析Javacore 和dump 文件,运气好点还能分析出个结果,运行遭的点,就直接去庙里烧香吧!每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了。我想Java 做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢?—— JVM 。JVM 全称是Java Virtual Machine ,Java 虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM 你是看不到的,它存在内存中。我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个JVM 也是有这成套的元素,运算器是当然是交给硬件CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU ,比如8086 系列的汇编也是可以用在8088 上的,但是就不能跑在8051 上,而JVM 的命令集则是可以到处运行的,因为JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。JVM 中我们最需要深入理解的就是它的存储部分,存储?硬盘?NO ,NO , JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中,这决定着我们程序运行的是否健壮、是否高效,接下来的部分就是重点介绍之。2、JVM 的组成部分我们先把JVM 这个虚拟机画出来,如下图所示: 从这个图中可以看到,JVM 是运行在操作系统之上的,它与硬件没有直接的交互。我们再来看下JVM 有哪些组成部分,如下图所示:该图参考了网上广为流传的JVM 构成图,大家看这个图,整个JVM 分为四部分:## Class Loader 类加载器 类加载器的作用是加载类文件到内存,比如编写一个HelloWord.java 程序,然后通过javac 编译成class 文件,那怎么才能加载到内存中被执行呢?Class Loader 承担的就是这个责任,那不可能随便建立一个.class 文件就能被加载的,Class Loader 加载的class 文件是有格式要求,在《JVM Specification 》中式这样定义Class 文件的结构:ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constant_pool_count-1];u2 access_flags;u2 this_class;u2 super_class;u2 interfaces_count;u2 interfaces[interfaces_count];u2 fields_count;field_info fields[fields_count];u2 methods_count;method_info methods[methods_count];u2 attributes_count;attribute_info attributes[attributes_count];}需要详细了解的话,可以仔细阅读《JVM Specification 》的第四章“The class File Format ”,这里不再详细说明。友情提示:Class Loader 只管加载,只要符合文件结构就加载,至于说能不能运行,则不是它负责的,那是由Execution Engine 负责的。## Execution Engine 执行引擎 执行引擎也叫做解释器(Interpreter) ,负责解释命令,提交操作系统执行。## Native Interface 本地接口本地接口的作用是融合不同的编程语言为Java 所用,它的初衷是融合C/C++ 程序,Java 诞生的时候是C/C++ 横行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++ 程序,于是就在内存中专门开辟了一块区域处理标记为native 的代码,它的具体做法是Native Method Stack 中登记native 方法,在Execution Engine 执行时加载native libraies 。目前该方法使用的是越来越少了,除非是与硬件有关的应用,比如通过Java 程序驱动打印机,或者Java 系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket 通信,也可以使用Web Service 等等,不多做介绍。## Runtime data area 运行数据区 运行数据区是整个JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行,Java 生态系统如此的繁荣,得益于该区域的优良自治。 整个JVM 框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互是可以通过本地接口进行,瞧,一个完整的系统诞生了!3、JVM加载class文件的原理机制 Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。类装载方式,有两种:1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,2.显式装载, 通过class.forname()等方法,显式加载需要的类 隐式加载与显式加载的区别:两者本质是一样? Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。 Java的类加载器有三个,对应Java的三种类:(java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 ) Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类) | - - ExtClassLoader // 负责加载扩展类(就是继承类和实现类) | - - AppClassLoader // 负责加载应用类(程序员自定义的类)三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。我们可以通过这样的代码来获取类加载器:ClassLoader loader = ClassName.class.getClassLoader();ClassLoader ParentLoader = loader.getParent();注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:1.装载:查找和导入class文件;2.连接: (1)检查:检查载入的class文件数据的正确性; (2)准备:为类的静态变量分配存储空间; (3)解析:将符号引用转换成直接引用(这一步是可选的)3.初始化:初始化静态变量,静态代码块。这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
作者:编程之家 时间:2019-03-22
java – 从JVM内部访问JMX
是否可以从该JVM实例内部访问JVM的JMX服务器?或者我是否必须通过标准的套接字/端口远程接口连接? +----------------------------------------+ Option 2: Connect | +---------------------------+ | through sockets like | | My Notifi
作者:编程之家 时间:2020-01-18
java – 哪个JVM打印出这样的线程转储?
我习惯于看到如下所示的 Java线程转储,这是由Sun HotSpot JVM及其衍生产品(如OpenJDK)生成的: "main" prio=10 tid=0x00007f4020009000 nid=0x538c in Object.wait() [0x00007f402891f000] java.lang.Thread.State: WAITING (on object monitor
作者:编程之家 时间:2020-01-19
java – JVM HOT交换
什么是JVM热插拔? 许多定义都表示此功能允许代码在调试过程中即时更新. 一些限制(如热交换)仅限于更新方法体,并且尝试向类添加方法和字段将不会成功. 任何人都可以用代码解释这个. 这意味着您可以在调试会话期间对代码进行某些更改,并使这些更改立即生效,而无需重新启动应用程序. 在某些情况下,这可能是非常方便的功能.但是,您通常会限制哪些类型的代码更改可以热插入正在运行的应用程序中.限制的确切性质取
作者:编程之家 时间:2020-01-24
java – JVM的GC事件的编程通知
我想跟踪GC花费了多少时间以及收集了多少内存,但不是通过分析GC日志(即分析我从-XX获得的内容:PrintGCWhatever). 我发现我可以使用Sun的ManagementFactory来获取一个GarbageCollectorMXBean,它可以给我一些包含内存信息的GCInfo对象,但我无法保证我可以通过这个意思收集所有GC. 有人知道在代码中执行此操作的方法吗? GarbageColl
作者:编程之家 时间:2020-01-25
jvm – 如何列出-Xlog的语法和可用标记
OpenJDK 9的新 Unified JVM Logging可以按标签过滤日志,但JEP不提供所有可用标签的列表.如何列出所有可用参数? java -Xlog:help打印参数语法,包括该特定版本中可用的标记列表,这些标记可能会随时间而变化. 请注意使用-Xlog进行日志记录:< tag>可能无法打印与该标记相关的所有内容,因为它要求日志消息仅包含该标记.使用-Xlog:< tag> *代替包含
作者:编程之家 时间:2020-01-28
java – 什么是JVM指令?
因此,我正在与一位运行Interviews(您的标准人力资源经理)的人谈论他们在面试中真正寻找的内容,并且他提到了有关测试JVM指令知识的内容(以及许多其他内容). 我不知道那是什么,但我以为他在谈论字节码指令. 我做了一些研究,似乎我在“JVM指令”上找不到任何东西,我发现它都是对字节码指令的引用,我已经知道了. 例如:http://docs.oracle.com/javase/specs/jv
作者:编程之家 时间:2020-01-30
垃圾收集 – JVM PrintGCApplicationConcurrentTime和PrintGCApplicationStoppedTime标志
我正在运行一个 Java程序,我需要花费多少时间来收集垃圾. 我找到了这两个JVM标志: -XX:PrintGCApplicationConcurrentTime -XX:PrintGCApplicationStoppedTime 但我无法找到有关它的信息. 我想PrintGCApplicationStoppedTime会打印应用程序时间在STW中的时间,但我不确定-XX:PrintGCAppli
作者:编程之家 时间:2020-01-31
java – 获取给定JVM实例中所有当前加载的类的列表
知道给定JVM实例当前加载哪些类是很方便的. 例如,有没有办法让他们通过JVisualVM? 编辑:我知道@ Java – Get a list of all Classes loaded in the JVM给出的解决方案,但我想知道是否有办法通过JVisualVM或其他工具来实现.目前我正在对抗RCP应用程序,我宁愿不必通过java工具运行应用程序(我很懒,是的). 你试过jconsole吗?
作者:编程之家 时间:2020-03-30
java – 强制jvm返回本机内存
参见英文答案 > JVM sending back memory to OS 3个 我不时在需要大量内存的eclipse任务中运行.所以jvm在任务运行时吞下大约2-3GB的RAM,没关系.但是一旦jvm占用了那个内存它就不会释放它而且我有一种情况,当堆中使用的内存大约是200mb,总堆大小约为3gb时,这真的是不需要的,因为
作者:编程之家 时间:2020-04-05
如何为多个jvm支持创建单例java类?
例如,我有DBManager. java Singleton Class,我必须在集群环境中部署它. 它是一个基于Web的应用程序,具有以下部署策略 Apache负载均衡器 – > Tomcat 6(群集中的3个服务器). 我必须为3个tomcat实例维护DBManager的单个实例. 我的代码是 package com.db.util; public class DBManager {
作者:编程之家 时间:2020-04-16
java – 什么JVM优化导致这些性能结果?
执行 Java REST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快. 码: @POST @Path("inline") public Response inline(String s) { return Response.status(Status.CREATED).build(); }
作者:编程之家 时间:2020-04-16
java – JVM是否有计划在运行时支持泛型?
你知道,就像CLR一样.有人甚至承认缺乏运行时通用信息是一个问题,并努力解决它? Java的设计者选择此解决方案来保持向后兼容性(在字节码级别).从那时起,存在更多的Java代码,因此破坏向后兼容性会产生更糟糕的后果.所以我怀疑他们会改变他们的想法.
作者:编程之家 时间:2020-04-16
java – 加载时出现Eclipse jvm.dll错误
尝试在几个月后打开 Eclipse并收到此错误: 所以我检查了该文件夹以查看它是否存在,并且它确实: 我检查了我的PATH是正确的,它也是正确的: 当第一次出现此错误时,我有3个Java安装. JRE 7 Update 10,JDK 7 Update 7 32位和64位. 我卸载了ALL并重新启动了我的机器.然后Eclipse说,正如预期的那样,我需要一个JRE或JDK.所以我下载并安装了最新的J
作者:编程之家 时间:2020-04-22
所有JVM /系统中的Java,Object.hashCode()结果常量?
Object.hashCode()的输出是否必须在同一个对象的所有JVM实现上相同? 例如,如果“test”.hashCode()在1.4上返回1,它是否可能在1.6上返回2.或者如果操作系统不同,或者实例之间存在不同的处理器架构,该怎么办? 否.hashCode的输出在JVM实现之间甚至在同一JVM上的程序的不同执行之间也可能发生变化. 但是,在您给出的具体示例中,“test”.hashCode
作者:编程之家 时间:2020-04-23
Clojure的STM模型可以在多个JVM上运行吗?
我知道Clojure在多核计算机上运行良好,但我想知道它是否适用于在多台计算机上分布的JVM集群? Runa考虑使用Terracotta,最终将 swarmiji作为分布式代理库发布. SMP系统和群集之间的真正区别之一是共享内存.在集群中,代码必须要求数据,而在SMP中,它可以直接读取数据.这有一些很好的优点和一些(缩放)缺点. Clojure的STM与其他许多STM系统相差很大,它建立在相对时
作者:编程之家 时间:2020-04-23
使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运行我们的应用程序)
更新: 现在使用地图.想要向其他实例发送内容的类发送对象即路由字符串. 使用对象流,使用Java serializable将对象写入servlet. 先写字符串然后再写对象. 接收servlet将输入流包装在ObjectInputStream周围.首先读取字符串,然后读取Object.路由字符串决定它去了. 更通用的方法可能是发送类名及其声明的方法或Spring bean名称,但这对我们来说已经足
作者:编程之家 时间:2020-04-26
java – JVM Spec,JVM Implementation,JVM Runtime之间的区别
我读了以下几个字,但我想知道它们之间的差异…… JVM规范,JVM实现,JVM运行时 JVM Spec:描述JVM应如何表现的文档. JVM实现:基于JVM Spec的JVM实现. JVM运行时:JVM实现的一个实例.
作者:编程之家 时间:2020-03-10
java – 我应该如何诊断和防止JVM崩溃?
当我遇到JVM崩溃时,我应该做什么(作为一个对JVM内部不了解的 Java程序员)呢? 特别是,您将如何生成可重现的测试用例?我应该在Sun(或IBM)的bug数据库中搜索什么?我可以从生成的日志文件中获取哪些信息(例如hs_err_pidXYZ.log)? 如果崩溃只发生在一台特定的机器上,运行 memtest.我已经看到重复发生的JVM崩溃只有两次,在这两种情况下,罪魁祸首都是硬件问题,即RA
作者:编程之家 时间:2020-03-06
java – 智能JVM和JIT微优化
随着时间的推移,Sun的JVM和JIT变得非常聪明.以前不再需要将常识作为必要的微优化的东西,因为它会得到照顾. 例如,过去应该将所有可能的类标记为final,因此JVM会尽可能多地内联代码.但是现在,JIT根据在运行时加载的类知道你的类是否是最终的,如果加载一个类使原始类不可能,它会取消内联方法并取消标记为最后. JVM或JIT还为您做了哪些其他智能微优化? 编辑:我把它做成了社区维基;我想随着
作者:编程之家 时间:2020-03-06
Java:JVM可用的核心?
在 Java中,方法Runtime.getRuntime().availableProcessors()具有以下Javadoc: Returns the number of processors available to the Java virtual machine. This value may change during a particular invocation of the vir
作者:编程之家 时间:2020-03-05
Java – 将java代理注入到运行jvm中
基本上,我正在尝试编写一些列出JVM加载的每个类的东西.我写的是有效的,但它只适用于它运行的jvm. 我精心设计了一个 java代理来动态注入另一个JVM,但后来意识到我实际上并不知道如何注入它. 我如何实际将此代理发送到另一个JVM? 可能吗? 动态代理需要声明在目标VM中附加时执行的agentmain(String,Instrumentation)方法.您可以使用tools.jar依赖项,它(
作者:编程之家 时间:2020-02-24
是否有基于JVM的度量库的python版本
我正在寻找一个性能指标库在 python. 我熟悉由Coda Hale编写的metrics,它是为JVM编写的,所以我想知道是否有一个python等同于(并且不使用JVM). 简而言之,该工具的要求清单是: >在执行时计算不同类型的度量.计数器,量具,米,计时器,直方图等.有一个很好的列表here >允许通过HTTP API轻松访问运行时数据. (我可以自己包装HTTP层,但如果它已经在其中加工了
作者:编程之家 时间:2020-02-22
java – JVM如何开始寻找类?
>我很好奇JVM在哪里执行程序?我更感兴趣的是,了解什么顺序和JVM在哪里查找类文件,就像它查看 java libs,扩展lib,classpath任何目录,如当前目录从哪里被调用?我对JVM行为更感兴趣,而不是类加载器加载类,我知道具有父代理机制直到root. >如果一个类是从文件系统上保存的编译类的目录执行的,并且同一个目录中的一个jar文件中执行一个类,那么JVM会加载两个还是只加一个? 假
作者:编程之家 时间:2020-02-21
jvm – 我怎么知道Docker容器为什么停了?
我有一个包含JVM进程的Docker容器.当过程结束时,容器完成并停止. 虽然幸运的是罕见的,但是我的JVM可以突然出现在强硬故障中. OutOfMemoryError异常.当这种情况发生时,我的容器就像一个正常的JVM出口一样停止. 我可以分发日志等,用于正常的JVM日志记录,但是在这个难以防止的情况下,我想知道JVM的死亡字,通常在stderr上发出. 有没有办法知道为什么我的集装箱停下来,环
作者:编程之家 时间:2020-02-21
java – 如何找出JVM应用于我的代码的优化?
JVM(特别是HotSpot VM)以其在运行时可以应用的大量优化而闻名. 有没有办法看一下某段代码,看看JVM实际上做了什么? 一个问题是“JVM实际上做了什么”会在调用之间改变,因为JVM可以自由地重新生成代码. 作为一个例子,我调查了几天前Hotspot与虚拟方法相比的最终方法.根据微观基准,我的结论是: >客户端JVM:如果方法有效地是最终的(没有任何加载的类覆盖它),则JVM使用非虚拟调
作者:编程之家 时间:2020-02-20
java – JVM上的内存分配是无锁的
当您在 Java中执行新的Object()时,jvm是否使用无锁定算法分配内存或需要锁定? 在这种情况下,我指的JVM是Hotspot VM.从我知道的一点,它只需要增加一个指针来分配内存超快.但是在多线程的情况下,增量是否需要锁定或CAS? 如上所述,默认是使用tlab.行为描述在 this glossary中如下 TLAB Thread-local allocation buffer. Use
作者:编程之家 时间:2020-02-20
上一页
112
113
114
115
116
117
118
119
下一页
小编推荐
热门标签
更多
python
JavaScript
java
HTML
reactjs
C#
Android
CSS
Node.js
sql
r
python-3.x
MysqL
jQuery
c++
pandas
Flutter
angular
IOS
django
linux
swift
typescript
路由器
JSON
路由器设置
无线路由器
h3c
华三
华三路由器设置
华三路由器
电脑软件教程
arrays
docker
软件图文教程
C
vue.js
laravel
spring-boot
react-native