jvm

Java中的四种引用类型

好久不见. 提交于 2020-02-28 22:19:27
大家对Java中的四种引用类型相信都不陌生,都知道这四种应用类型分别是 强引用(Strongly Reference)、软引用(Soft Reference)、弱引用(Weak Refrence)和虚引用(Phantom Reference) 。但也好像再具体一点就有点模糊了,比如jdk为什么要设计这四种引用类型?既然设计了它肯定就会有对应的引用场景等等。我本人之前对这些的了解也是知道有这么个东西,再具体点的就不知道了,后来看了马士兵老师的一节相关公开课才有了个大体的了解(你用大腿想一想,我这肯定不是做广告),现在对相关的内容做个总结,希望可以帮到有相关困扰的同学。 一、强引用 概念: 关于强引用我想就不必太多的介绍了,强引用是java中最传统的“引用”定义,我们平常做“ Object obj = new Object() "的操作就是强引用。 特点: 强引用无论在任何情况下,只要强引用关系还在,垃圾收集器就永远不会回收掉被引用的对象。 代码演示: public class Person { @Override protected void finalize() throws Throwable { System.out.println("finalize..."); } } 上面我们新建了一个Person类,并且重写了它其中的finalize()方法

图示JVM工作原理

こ雲淡風輕ζ 提交于 2020-02-28 20:29:32
JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器 为什么要记录当前线程所执行的字节码的行号?直接执行完不就可以了吗?

图示JVM工作原理

房东的猫 提交于 2020-02-28 19:36:29
JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器 为什么要记录当前线程所执行的字节码的行号?直接执行完不就可以了吗?

jps命令详解

喜欢而已 提交于 2020-02-28 17:17:56
JPS 名称: jps - Java Virtual Machine Process Status Tool 命令用法: jps [options] [hostid] options:命令选项,用来对输出格式进行控制 hostid:指定特定主机,可以是ip地址和域名, 也可以指定具体协议,端口。 [protocol:][[//]hostname][:port][/servername] 功能描述: j ps是用于查看有权访问的hotspot虚拟机的进程. 当未指定hostid时,默认查看本机jvm进程,否者查看指定的hostid机器上的jvm进程,此时hostid所指机器必须开启jstatd服务。 jps可以列出jvm进程lvmid,主类类名,main函数参数, jvm参数,jar名称等信息。 命令选项及功能: 没添加option的时候,默认列出VM标示符号和简单的class或jar名称.如下: -p :仅仅显示VM 标示,不显示jar,class, main参数等信息. -m:输出主函数传入的参数. 下的hello 就是在执行程序时从命令行输入的参数 -l: 输出应用程序主类完整package名称或jar完整名称. -v: 列出jvm参数, -Xms20m -Xmx50m是启动程序指定的jvm参数 -V: 输出通过.hotsportrc或 -XX:Flags=<filename

java中的内存模型

独自空忆成欢 提交于 2020-02-28 16:05:23
概述 在java中应为不同的目的可以将java划分为两种内存模型:gc内存模型。并发内存模型。 gc内存模型 java与c++之间有一堵由内存动态分配与垃圾收集技术所围成的“高墙”。墙外面的人想进去,墙里面的人想出来。 java在执行java程序的过程中会把它管理的内存划分若干个不同功能的数据管理区域。如图: 整体上。分为三部分:栈,堆,程序计数器,他们每一部分有其各自的用途;虚拟机栈保存着每一条线程的执行程序调用堆栈;堆保存着类对象、数组的具体信息;程序计数器保存着每一条线程下一次执行指令位置。这三块区域中栈和程序计数器是线程私有的。也就是说每一个线程拥有其独立的栈和程序计数器。我们可以看看具体结构: 虚拟机/本地方法栈 在栈中,会为每一个线程创建一个栈。线程越多,栈的内存使用越大。对于每一个线程栈。当一个方法在线程中执行的时候,会在线程栈中创建一个栈帧(stack frame),用于存放该方法的上下文(局部变量表、操作数栈、方法返回地址等等)。每一个方法从调用到执行完毕的过程,就是对应着一个栈帧入栈出栈的过程。 本地方法栈与虚拟机栈发挥的作用是类似的,他们之间的区别不过是虚拟机栈为虚拟机执行java(字节码)服务的,而本地方法栈是为虚拟机执行native方法服务的。 方法区/堆 在hotspot的实现中,方法区就是在堆中称为永久代的堆区域。几乎所有的对象/数组的内存空间都在堆上

面试基础--JVM

最后都变了- 提交于 2020-02-28 08:40:54
一 类加载   classs文件是通过类的加载器装载到jvm中的   java默认的类加载器有三种:      1.Bootstrap ClassLoader 启动类加载器 :启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,                        它负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意必由于虚拟机是按照文件名识别加载jar包的,如rt.jar,                        如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类)      2.Extension ClassLoader 扩展类加载器 :负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包      3.App ClassLoader 应用类加载器(系统加载器) :负责记载classpath中指定的jar包及目录中class         工作过程: 1、当AppClassLoader加载一个class时

Java入门

帅比萌擦擦* 提交于 2020-02-28 08:35:40
Java简介     Java是SUN(Stanford University Network)1995年推出的一门高级编程语言,2009年被Oracle收购,它是一种面向Internet的编程语言。   Java的标准版——基础核心:java SE,包括面向对象、JVM、API等。在java SE的基础上,分为Java的企业版——java EE,包括JSP、EJB、服务等,用于大型企业级应用的开发;以及java ME,主要用于嵌入式的开发。   JVM(Java Virtual Machine),是java技术的核心。   源文件是文本文件,字节码文件是二进制文件,字节码文件与平台无关(Windows or linux)。字节码文件通过解释器解释翻译后,才能执行。JVM中包含解释器,Java语言的跨平台就说通过JVM来实现的。   JDK——Java Development Kit(Java开发工具包)   JRE——Java Runtime Environment(Java运行时环境)   如果要运行Java程序,我们需要安装JRE,下图显示了JDK、JRE和JVM的关系,我们安装了JDK时,就已经包含了JRE和JVM了。(Eclipse运行在JRE之上)    Java开发环境搭建   步骤:安装JDK—>配置环境变量:JAVA_HOME--配置JDK安装路径、PATH-

重识JVM(一):运行时数据区域

倾然丶 夕夏残阳落幕 提交于 2020-02-28 05:11:17
记得上一次看jvm相关的知识还是在大四的时候,两年过去了,记忆已经逐渐模糊。现在来重识一下jvm,希望温故而知新,一些重要的知识点我会在博客上把学习的知识记录下来。 想要了解jvm,就一定需要了解java虚拟机是如何使用内存的,要不在出现内存泄漏和内存溢出等问题时,我们是没法准确地排查出错误的,下面就让我一起来重新认识一下java虚拟机在执行java程序的过程中的运行时数据区。 参照上图,我们来进一步了解一下运行时数据区中各个区域的作用和详细情况。 一.程序计数器 1.从最简单的程序计数器说起,程序计数器就是当前线程执行字节码的 行号指示器 ,字节码解释器工作时就是通过改变这个计数器的值来选去下一跳需要执行的字节码指令, 分支, 循环, 跳转, 异常处理,线程恢复等基础功能都需要依赖这个计数器 来完成。 2.每条线程都需要有一个独立的程序计数器, 各条线程之间的计数器 互不影响, 独立存储 , 我们称这类内存区域为"线程私有内存"。 3.如果线程正在执行的是一个Java方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是Native方法, 这个计数器值则为空(Undefined)。 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 二.java虚拟机栈 1.与程序计数器一样, Java虚拟机栈也是线程私有的

JVM垃圾回收详解

Deadly 提交于 2020-02-28 02:18:04
通常,我们在写java程序的时候,似乎很少关注内存分配和垃圾回收的问题。因为,这部分工作,JVM已经帮我们自动实现了。 这样看起来,好像很美好,但是任何事情都有两面性。虽然JVM会自动的进行垃圾回收,但是,如果遇到有些问题,JVM自己也处理不了呢? 因此,我们需要了解一下JVM垃圾回收是怎样运作的,这样才能在遇到问题的时候,有的放矢。所以,今天就来聊一聊JVM的垃圾回收吧。 首先,思考一下,为什么需要进行垃圾回收? 我们知道,在创建对象的时候,Java会把对象的内容放到堆中。随着时间的推移,堆中的对象肯定会越来越多,但是,堆的大小是有限制的。如果,我们不进行垃圾回收,也就是把无用的对象进行清除和回收,那么JVM将不堪重负,最终导致内存泄漏。 既然我们需要进行垃圾回收,那么,首先得知道什么是垃圾。 在垃圾收集器对堆内存进行回收前,会先判断哪些对象还在“存活”,哪些对象已经“死去”(即不可能再被任何途径使用的对象),这些“死去”的对象,就是我们需要进行回收的垃圾。 那么,通过什么方式去判定是否为垃圾呢?(即判定对象是否存活) 引用计数算法(已淘汰) 引用计数算法,是指给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,当引用失效时,计数器的值就减1。当计数器值为0时,该对象就会被回收。 可以说,引用计数算法的实现非常简单,判定效率也很高。但是,我们忽略了一个问题

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

霸气de小男生 提交于 2020-02-27 22:38:58
问题 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