jvm

What does 'intrinsify' mean in the JVM source code?

佐手、 提交于 2020-02-27 22:38:18
问题 Does 'intrinsify' means that source code of JVM is somewhat 'conservative', but the JIT compiler can do some optimization when the JVM warms up? For example, UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) UnsafeWrapper("Unsafe_SetOrderedObject"); oop x = JNIHandles::resolve(x_h); oop p = JNIHandles::resolve(obj); void* addr = index_oop_from_field_offset_long(p, offset); OrderAccess::release(); if (UseCompressedOops) { oop_store

JVM内存结构 VS Java内存模型 VS Java对象模型

≡放荡痞女 提交于 2020-02-27 20:06:33
本文转自 http://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的 JVM内存结构 、 Java内存模型 和 Java对象模型 ,这就是 三个截然不同的概念 ,但是很多人容易弄混。 JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。在《 Java虚拟机规范(Java SE 8) 》中描述了JVM运行时内存区域结构如下: 各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点: 1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。 2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。 3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。 4

JVM内存结构 VS Java内存模型 VS Java对象模型

瘦欲@ 提交于 2020-02-27 19:35:24
本文转自 http://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的 JVM内存结构 、 Java内存模型 和 Java对象模型 ,这就是 三个截然不同的概念 ,但是很多人容易弄混。 JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。在《 Java虚拟机规范(Java SE 8) 》中描述了JVM运行时内存区域结构如下: 各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点: 1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。 2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。 3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。 4

【ActiveMQ Tuning】System Environment

China☆狼群 提交于 2020-02-27 08:52:42
http://fusesource.com/docs/broker/5.4/tuning/GenTuning-SysEnv.html Overview :在研究ActiveMQ Broker优化之前,值的重点关注一下系统环境对于性能的影响。 Disk speed (磁盘速度):持久化的Broker,磁盘速度是一个重大的影响因素。举例来说:典型的桌面磁盘的寻道时间为9ms,而高性能的服务器磁盘寻道时间则为3ms。同样你需要确保磁盘没有过多的碎片。 Network performance (网络性能):不管是Broker是否持久化,网络速度都是一个限制因素。如果网络很慢的话,它会制约通过Broker的通道。一种策略是你可以压缩大消息。 (see Enabling compression ),它可以降低网络延迟的风险。因此,启动更多异步行为可能也是个好主意。 Hardware specification (硬件规格):重要的硬件基础包括CPU的速度和个数,broker的可用内存。特别的,提高可用内存可以提高多个服务的性能。 举例来说,如果broker的B-tree index可以全部加载到内存中的话,可以显著的减少对于磁盘读写的需求度。另外,如果消费者较慢,broker需要大量的内存用于接收消息。 Memory available to the JVM (JVM可用内存):使用 -Xmx

Java: overhead of entering/using “try-catch” blocks?

匆匆过客 提交于 2020-02-27 08:35:31
问题 The question says it all. Although the hit is not highly significant (I measured it to be between 1.5x to 2x slower), there's no difference between the byte code with try-catch and the byte code without it. So what makes it generally slower? Pl. note that the question is not about overhead of throwing an exception, but of entering/leaving a try block. EDIT: here's the code (run on Hotspot 1.6.0_31 server) static void tryCatch() { int i = 0; long l1 = getTime(); for(int j = 0; j < 100000; j++)

转:String StringBuffer StringBuilder区别

倖福魔咒の 提交于 2020-02-27 04:35:33
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了。嘿嘿.... 众所周知,String是由字符组成的串,在程序中使用频率很高。Java中的String是一个类,而并非基本数据类型。 不过她却不是普通的类哦!!! 【镜头1】 String对象的创建 1、关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world"); 问题是参数"Hello world"是什么东西,也是字符串对象吗?莫非用字符串对象创建一个字符串对象? 2、当然,String类对象还有一种大家都很喜欢的创建方式:String s="Hello world"; 但是有点怪呀,怎么与基本数据类型的赋值操作(int i=1)很像呀? 在开始解释这些问题之前,我们先引入一些必要的知识: ★ Java class文件结构 和常量池 我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行。 class文件是8位字节的二进制流 。这些二进制流的涵义由一些紧凑的有意义的项 组成

mac下编译openjdk1.9及集成clion动态调试

倖福魔咒の 提交于 2020-02-27 03:47:50
晚上被小伙伴问道如何使用ide进行jvm源码的调试,刚好前段时间花了点时间折腾了一下,mac最新版本下jvm9顺利编译通过,并且可以完美集成clion进行调试(支持windows),下面记录一下全过程,如果想看效果的话,可以直接拉到 集成到clion进行调试 小节末尾 mac下openjdk源码编译过程 准备编译环境准备 我的mac的版本如下 image.png 由于openjdk1.9之前的版本对mac下编译支持得不是很流畅,所以这篇文章选择openjdk1.9 编译之前,首先你需要准备 homebrew,homwbrew是mac下的包管理器,如果你的mac上没有安装,可以按照下面的方式来安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" homwbrew下载完成之后,接下来准备编译环境 首先安装openjdk的版本管理工具mercurial 然后安装ccache和freetype,ccache用来加速编译,freetype在编译过程也会依赖到 上述准备编译环境的脚本为 brew install mercurial brew install ccache brew install freetype

类加载机制与反射

☆樱花仙子☆ 提交于 2020-02-27 02:43:40
1、类的加载、连接和初始化 加载类的时机 第一次使用该类 采用预加载机制加载类 Java虚拟机进程(JVM进程) 同一个JVM里的所有线程、所有变量都处于同一个进程里,都使用该JVM进程的内存区 JVM进程终止时机 程序运行到最后正常结束。 程序运行到使用System.exit()或Runtime.getRuntime().exit()代码处结束程序。 程序执行过程中遇到未捕捉的异常或错误而结束。 程序所在平台强行结束了JVM进程。 两个JVM进程间并不会共享数据 类的加载 加载、连接、初始化(当程序使用某个类时,如果该类还未加载进内存中,执行这三个步骤来对类进行初始化。)(这三个步骤通常连续完成,故统称为类加载、类初始化) 类加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。 开发者可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器,可以从不同来源加载类的二进制数据 从本地文件系统加载class文件 从JAR包加载class文件 通过网络加载class文件 把一个java源文件动态编译,并执行加载 类加载器通常无需等到“首次使用”该类时才加载该类

Java程序员修炼之道

故事扮演 提交于 2020-02-26 22:49:25
《Java程序员修炼之道》 基本信息 原书名:The well-grounded Java developer:vital techniques of Java 7 and polyglot programming 作者: (英)Benjamin J.Evans (荷兰)Martijn Verburg 译者: 吴海星 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115321954 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 页码:1 版次:1-1 所属分类:计算机 更多关于 》》》《 Java程序员修炼之道 》 内容简介 计算机书籍   《java程序员修炼之道》分为四部分,第一部分全面介绍java 7 的新特性,第二部分探讨java 关键编程知识和技术,第三部分讨论jvm 上的新语言和多语言编程,第四部分将平台和多语言编程知识付诸实践。从介绍java 7 的新特性入手,本书涵盖了java 开发中最重要的技术,比如依赖注入、测试驱动的开发和持续集成,探索了jvm 上的非java 语言,并详细讲解了多语言项目, 特别是涉及groovy、scala 和clojure 语言的项目。此外,书中含有大量代码示例,帮助读者从实践中理解java 语言和平台。    《java程序员修炼之道》适合java 开发人员以及对java7 和jvm

JVM调优

吃可爱长大的小学妹 提交于 2020-02-26 21:48:25
文章目录 Java三大性能调优参数 JVM常用内存调优命令 Java三大性能调优参数 java - Xms128m - Xmx128m - Xss256k - jar xxxxx . jar -Xms:堆的初始值,java堆的大小,-Xmx是其最大值 -Xmx:堆能达到的最大值 -Xss:规定了每个线程虚拟机栈(堆栈)的大小,一般256k就足够了,此配置会影响此进程中并发线程数的大小 JVM常用内存调优命令 JVM在内存调优方面,提供了几个常用的命令,分别为jps,jinfo,jstack,jmap以及jstat命令。分别介绍如下: jps :主要用来输出JVM中运行的进程状态信息,一般使用jps命令来查看进程的状态信息,包括JVM启动参数等。 jinfo :主要用来观察进程运行环境参数等信息。 jstack:主要用来查看某个Java进程内的线程堆栈信息。jstack pid 可以看到当前进程中各个线程的状态信息,包括其持有的锁和等待的锁。 jmap :用来查看堆内存使用状况。jmap -heap pid可以看到当前进程的堆信息和使用的GC收集器,包括年轻代和老年代的大小分配等 jstat :进行实时命令行的监控,包括堆信息以及实时GC信息等。可以使用jstat -gcutil pid1000来每隔一秒来查看当前的GC信息。 关于JVM性能调优的深入讲解,这位大哥讲得很全面了