jvm

Java编译器、JVM、解释器

徘徊边缘 提交于 2020-01-26 00:15:51
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。      一.Java源文件的编译、下载 、解释和执行   Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行的字节码。这一编译过程同C/C++ 的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。      运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时

JDK、JRE、JVM三者间的关系

杀马特。学长 韩版系。学妹 提交于 2020-01-25 22:02:37
JDK(Java Development Kit)Java开发工具包 JRE(Java Runtime Environment)Java运行环境 JVM(Java Virtual Machine)Java虚拟机 JDK = JRE + Java 工具(javac/java/jdb等) + Java 基本类库(Java API 包括rt.jar) JRE = JVM 标准实现 + Java 核心类库 Java 跨平台(write once run anywhere) 跨平台指软件开发中不依赖于操作系统,也不依赖于硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。 JVM是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。 也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。 只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。 JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 来源: CSDN 作者: RemY_123 链接: https://blog.csdn

JVM(四)---Heap堆结构简介、对象生命周期

狂风中的少年 提交于 2020-01-25 10:59:45
堆体系结构: 一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。 堆内存分为三个部分: 新生区 养老区 永久代 逻辑上由三个组成,物理上只由新生+养老组成。 在new的时候其实是new在新生区的伊甸园区。 自我理解: 当new的数目较多的时候,就会触发伊甸园区的GC(垃圾回收机制或者YGC,Y是指样,就是指伊甸园)。垃圾回收机制有两种。当new的数目超过伊甸园区的存储的时候,会产生堆内存溢出,这个时候YGC会将伊甸园里的new基本全部清空,然后把没有被清理的new移动到幸存者0区(from区/S0),一直循环这个一个过程,如果又超过了伊甸园区的存储,S0和S1会进行交换。伊甸园区满了去S0区,S0区满了去S1区(to区),S1满了去养老区,而且每次YGC的工作机制是,第一次清理伊甸园区new的,这时候S0和S1都没有new,没有被YGC清除的进入S0第二次YGC会清理S0和伊甸园区的new,这时候S1区没有new,没有被YGC清除的进入过S0的进S1,没进入S0的进S0.第三次清除S0 S1 和伊甸园区总共的new,这时候以此类推,在S1中没有被清除的进入养老区。如果new的个数还超过了养老区的内存,就开启FULL GC(FGC),如果有开启了FGC

JavaWeb项目IDEA启动后OutOfMemoryError: PermGen space错误

六眼飞鱼酱① 提交于 2020-01-25 09:19:10
IDEA针对Tomcat的JVM参数设置 碰到个问题,项目启动后一直有OutOfMemoryError: PermGen space错误,这个问题第一反应改IDEA的VM Options,没用,然后去改了Tomcat的Catalina.bat中的JAVA_OPTS,依然没有卵用,最后才直接去改了右上角edit Configuration中的VM options为 -Xms1024m -Xmx2048m -Xss1024K -XX:MetaspaceSize=512m ,解决。 JVM部分配置参数解析 -Xms:内存堆栈最小值(即为jvm启动时分配的内存,比如-Xms200m,表示分配200M) -Xmx:内存堆栈最大值(即为jvm启动时分配的内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存) -Xss:为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M -XX:MetaspaceSize:这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚 -XX:MaxMetaspaceSize:这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序 -XX:+HeapDumpOnOutOfMemoryError

Is SimpleDateFormat in Java and Android different?

こ雲淡風輕ζ 提交于 2020-01-25 07:53:10
问题 When we call parseJavaAndroid("2018-04-27T22:31:07.962-05:00") from JVM it gives ParseException while a call from Emulator/Android Real device it works fine. When we change SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH) to SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH) in Android, it throws: IllegalArgumentException with message "Unknown pattern character 'X' method". It works fine in JVM and gives ParseException in Emulator/Android Real device. public

android JVM运行机制

我的未来我决定 提交于 2020-01-25 03:53:41
1 JVM启动流程 2 JVM基本结构 2.1 PC寄存器 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 2.2 方法区 保存装载的类信息: 类型的常量池 字段、方法信息 方法字节码 通常和永久区(Perm)关联在一起 注意: JDK6时,String等常量信息至于方法 JDK7时,已经移动到了堆 2.2 Java堆 和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC的主要工作区间 2.3 Java栈 线程私有 栈由一系列帧组成(因此Java栈也叫Java帧栈) 帧保存一个方法的局部变量、操作数帧、常量池指针 每一次方法调用创建一个帧,并压栈 局部变量表 包括参数和局部变量 public class StackDemo { public static int runStatic ( int i, long l, float f, Object o, byte b ) { return 0 ; } public int runInstance ( char c, short s, boolean b ) { return 0 ; } } 操作数栈 Java没有寄存器,所有参数传递使用操作数栈 public static int add ( int a

Java Error Double Free or Corruption (Memory)

限于喜欢 提交于 2020-01-25 03:18:26
问题 could someone help me on this error, I've never seen it, it's a bug of JDK or was created by a burst of memory? I'm using: jdk1.6.0_21 The beginning of my error: *** glibc detected *** java: double free or corruption (fasttop): 0x00007f3f00410020 *** ======= Backtrace: ========= /lib64/libc.so.6(+0x75018)[0x7f3f93d75018] /lib64/libc.so.6(cfree+0x6c)[0x7f3f93d79f6c] /usr/lib64/libcrypto.so.0.9.8(CRYPTO_free+0x19)[0x7f3efe8d9b09] /usr/lib64/libcrypto.so.0.9.8(OBJ_NAME_add+0xa4)[0x7f3efe8db3a4]

Java JVM 引用有什么用

馋奶兔 提交于 2020-01-25 03:15:28
专栏原创出处: github-源笔记文件 , github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java JVM-虚拟机 一、引用的概念 JDK 1.2 版之后引入了软(SoftReference)、弱(WeakReference)、虚(PhantomReference)三种引用。 强引用:最传统的「引用」的定义,是指在程序代码之中普遍存在的引用赋值,即类似 Object obj=new Object() 这种引用关系。只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。 软引用:描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。 弱引用:描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。 虚引用:是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。 二

JVM简单调优及工作中例子记录

倾然丶 夕夏残阳落幕 提交于 2020-01-25 02:42:06
前序: Jvm调优需要我们对系统有所了解,其中比较关键的是对核心业务的理解,特别是会造成频繁GC的部分,比如高并发造成的不及时回收。 要知道为什么会造成频繁GC,首先我们要懂怎么估算java类的大小 下面列举各个基本类型和字符串估算的表格,以及测试的类 基本类型 大小(字节) 取值范围 装箱基本类型 int 4 -2^31 ~ 2^31-1 Integer char 2 Character byte 1 -2^7 ~ 2^7-1 Byte short 2 -2^15 ~ 2^15-1 Short long 8 -2^63 ~ 2^63-1 Long float 4 Float double 8 Double boolean 1或4 true~false Boolean 注释 :1字节(byte) = 8比特(bit),1kb = 1024字节。为什么boolea需要4个字节,原则上只需要1个比特,但是操作系统以字节作为单位,所以至少要一个字节。又因为jvm用int替代boolean,所以需要4字节。 -- 参考地址: https://binkery.com/archives/346.html 讲解完基础类型,我们大概看一下String字符是多少字节( 默认就是 2 字节 ): Java规定了字符的内码要用UTF-16编码,一个字符是2个字节。外码字符所占字节取决于具体编码

JAVA 虚拟机学习笔记

痞子三分冷 提交于 2020-01-25 01:10:02
本文是作者学习了《深入理解Java虚拟机_JVM高级特性与最佳实践 第2版》后的一些笔记和总结,希望对学习虚拟机的小伙伴有所帮助,如果想了解更多java虚拟机细节的小伙伴可以去阅读《深入理解Java虚拟机_JVM高级特性与最佳实践 第2版》;本文所讲JDK版本为OpenJDK 1.7,图片来自于《深入理解Java虚拟机_JVM高级特性与最佳实践 第2版》; Java虚拟机运行时数据区域 图 1-1 如图1-1所示,java运行时数据区域主要包括方法区、虚拟机栈及本地方法栈、堆、程序计数器; 程序计数器: 程序计数器管理着很小的内存空间并且是线程私有的,里面存储着当前线程所执行的字节码的指令地址,字节码解释器就是通过改变这个计数器的值来获取下一条需要执行的字节码指令,如果线程执行的是一个Native方法则这个计数器的值为空 2. 虚拟机栈: 虚拟机栈和程序计数器一样也是线程私有的生命周期和线程一样,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储方法的局部变量表、操作数栈、动态链接、方法出口信息等;方法的调用到执行完成的过程对应着虚拟机栈的栈帧入栈和出栈的过程; 3.本地方法栈: 本地方法栈和虚拟机栈的功能大同小异,区别主要是虚拟机栈执行的是java方法,而本地方法栈执行的是虚拟机本地Native方法方法服务(可以包括其他的语言服务,如c/c++)