jvm

JVM双亲委派模型

自作多情 提交于 2020-03-01 09:36:53
Java类加载器 双亲委派模式要求除了顶层的BootstrapClassLoader之外,其余的类加载器都应当有自己的父类加载器,双亲委派模式中的父子关系并非通常所说的类继承关系,而是 采用组合关系来复用父类加载器的相关代码 类加载器之间的关系如下: 类装载方式: 隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 显式装载, 通过class.forName()等方法,显式加载需要的类 类加载的动态性体现: 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现 双亲委派模型的工作原理 当一个类加载器收到了类加载请求后,他并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,一次递归,最终找到最顶层的BootstrapClassLoader,如果父类加载器可以完成此类加载任务,则成功返回,否则父类加载器会抛出异常,通知子类加载器自己去加载,这是子类加载器才会尝试自己去加载,这就是双亲委派模型。

轻松搞定jvm类加载器

余生长醉 提交于 2020-03-01 09:20:12
什么是类的加载 我们平时所编写的“xx.java”文件需要经过我们所知的java编译器(javac)编译成“xx.class”文件,这个文件存放着编译后jvm指令的的二进制信息。而**当我们需要用到某个类时,jvm将会加载它,并在内存中创建对应的class对象,这个过程称之为类的加载。**过程如下: 类的加载、连接、初始化 1. 加载 通过类的包名和雷鸣查找到此类的字节码文件,将xx.class文件中的二进制数据读入到jvm内存,并存入其中的方法区内,然后利用字节码文件创建一个class对象存入到堆之中,用来封装类的数据结构等。 连接(验证、准备、解析): 2. 连接包括三步: 验证:确保被加载类的正确性,是否对jvm有害 准备:为**类的静态变量(static)**分配内存并将其赋值为默认变量(非赋值)eg:static int a = 1;(为a分配内存并设置为0,将a赋值为1的动作是在初始化过程中完成的,而final static int a = 1赋值是在javac过程中完成的。) 解析:把类中的符号引用转化为直接引用,符号引用:我们所写的int a 就是符号引用,直接引用:目标的指针、偏移量内存中的引用,类似c/c++中的指针。 3. 初始化 如果有父类,此时加载父类并进行初始化,静态变量、成员变量等,再加载子类。 类加载器 类的加载是由类加载器完成的

jvm内存设置

匆匆过客 提交于 2020-03-01 06:57:17
Eclipse崩溃,错误提示: MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains. It is strongly recommendedthat you exit and restart MyEclipse with new virtual machine memoryparamters to increase this memory. Failure to do so can result indata loss. The recommended Eclipse memory parameters are: eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1.参数的含义-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了-Xms128m JVM初始分配的堆内存-Xmx512m JVM最大允许分配的堆内存,按需分配-XX:PermSize=64M JVM初始分配的非堆内存-XX

偏向锁、轻量级锁、重量级锁区别与联系

百般思念 提交于 2020-03-01 05:53:55
今天总结了锁升级(偏向锁、轻量级锁、重量级锁)和锁优化下面开始总结。 其实这些内容都是JVM对锁进行的一些优化,为什么分开讲,原因是锁升级比较重要,也比较难。 一、锁升级 在1.6之前java中不存在只存在重量级锁,这种锁直接对接底层操作系统中的互斥量(mutex),这种同步成本非常高,包括操作系统调用引起的内核态与用户态之间的切换。线程阻塞造成的线程切换等。因此在jdk 1.6中将锁分为四种状态:由低到高分别为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。 1. 偏向锁。什么是偏向锁呢?为什么要引入偏向锁呢? 偏向锁是如果一个线程获取到了偏向锁,在没有其他线程竞争的情况下,如果下次再执行该同步块时则只需要简单判断当前偏向锁所偏向的对象是否是当前线程,如果是则不需要再进行任何获取锁与释放锁的过程,直接执行同步块。至于为什么引入偏向锁,是因为经过JVM的开发人员大量的研究发现大多数时候都是不存在锁竞争的,通常都是一个线程在使用锁的时候没有其他线程来竞争,然而每次都要进行加锁和解锁就会额外增加一些没有必要的资源浪费。为了降低这些浪费,JVM引入了偏向锁。 a) 偏向锁的获取以及升级过程如下: 当一个线程在执行同步块时,它会先获取该对象头的MarkWord,通过MarkWord来判断当前虚拟机是否支持偏向锁(因为偏向锁是可以手动关闭的),如果不支持则直接进入轻量级锁获取过程

Eclipse - Failed to load the JNI shared library

痴心易碎 提交于 2020-03-01 04:22:18
问题 Every time I try to start Eclipse, it says Failed to load the JNI shared libraby "C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll" I have no clue why this happens, because I reinstalled JDK, JRE and Eclipse multiple times. All the 64 bit version (I've got Windows 7 64 bit) 回答1: Alright, it somehow worked using the 32 Bit version of Eclipse... 回答2: If you have installed all 64 bit version of Eclipse and JDK, you can check your system environment variable. Probably you set on old JAVA_HOME

图示JVM工作原理

淺唱寂寞╮ 提交于 2020-03-01 04:05:24
JDK,JRE,JVM的联系是啥? 不格网 m.vbuge.com 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虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器

java class对象加载

半城伤御伤魂 提交于 2020-03-01 01:18:44
class对象加载过程 为理解RTTI 在Java 里如何工作,首先必须了解类型信息在运行期是如何表示的。这时要用到一个名为 “Class 对象”的特殊形式的对象,其中包含了与类有关的信息(有时也把它叫作“元类”)。事实上,我 们要用Class 对象创建属于某个类的全部“常规”或“普通”对象。 对于作为程序一部分的每个类,它们都有一个Class 对象。换言之,每次写一个新类时,同时也会创建一个 Class 对象(更恰当地说,是保存在一个完全同名的.class 文件中)。在运行期,一旦我们想生成那个类的 一个对象,用于执行程序的Java 虚拟机(JVM)首先就会检查那个类型的Class 对象是否已经载入。若尚未 载入,JVM 就会查找同名的.class 文件,并将其载入。所以Java 程序启动时并不是完全载入的,这一点与许 多传统语言都不同。 一旦那个类型的Class 对象进入内存,就用它创建那一类型的所有对象。 来源: CSDN 作者: 六月·飞雪 链接: https://blog.csdn.net/z_ssyy/article/details/104582144

腾讯云服务器Centos7上安装JDK

冷暖自知 提交于 2020-02-29 20:47:32
登陆云服务器 1.输入命令yum install java-1.8.0-openjdk java-1.8.0openjdk-devel进行安装, 出现Complete!后就安装完成了。 2.检查JDK是否安装成功 java -version 3.Linux上使用yum命令后,会将OpenJDK安装到/usr/lib/jvm/目录下: 来源: CSDN 作者: 梦凝哲雪 链接: https://blog.csdn.net/Klhz555/article/details/104576867

通过JVM日志来进行安全点分析

╄→гoц情女王★ 提交于 2020-02-29 19:38:31
许多事件都可能会导致JVM暂停所有的应用线程。这类暂停又被称为”stop-the-world”(STW)暂停。触发STW暂停最常见的原因就是垃圾回收了( github中的一个例子 ),但不同的JIT活动( 例子 ),偏向锁擦除( 例子 ), 特定的JVMTI操作 ,以及许多场景也可能会导致应用程序暂停。 应用程序线程可以被安全地停止掉的那个时间点,就叫做安全点。这一术语也通常用来指代SWT暂停。 通常来讲GC日志都是打开的。然而,并非所有安全点的信息都能完整地记录下来。想获取到完整的日志,可以使用下列的JVM选项: 1 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime 从参数名字来看你可能会觉得是与GC相关的,其实不然——打开这些选项能够记录下所有的安全点,而不止是GC暂停的。如果你用上述的选项来运行下这个例子( github源码 ) 你会在标准输出中看到如下信息: 1 2 3 4 Application time: 0.3440086 seconds Total time for which application threads were stopped: 0.0620105 seconds Application time: 0.2100691 seconds Total time

jvm垃圾收集器与内存分配策略

佐手、 提交于 2020-02-29 17:16:36
垃圾收集器与内存分配策略: 以下参考周志明的<<深入理解jvm高级特性与最佳实践>>。 判断对象是否存活: 引用计数 :通过判断对象被引用的次数(为0,则表示不可被使用),但这很难解决 对象相互循环引用 的问题。 根搜索算法 :即采用 有向图 的方式,判断从 GC Roots 到某个对象 是否可达 。 上图中obj1,obj2,obj3,obj4可达,obj5,obj6不可达(可被GC回收)。 可作为GC Roots的对象: 1. 虚拟机栈中 局部变量 引用的对象。 2. 类静态属性 引用的对象。 3. 常量 引用的对象。 4. JNI 中引用的对象。 java中的引用类型: java中有四种引用类型(由强到弱): 强引用(StrongReference) : 只要对象有被强引用,对象就 不会被GC回收 ,如Object o = new Object()中的o就是强引用。 软引用(SoftReference) : 软引用的对象为不必须回收的对象,但在 内存不足发生溢出之前 ,GC会在回收时,将软引用的对象视作可可回收的对象,所以SoftReference可以用来做一些 高速缓存 。 弱引用(WeakReference) :软引用的对象只能 存活到下一次GC的时候 ,无论内存是否足够,如 WeakHashMap 类。 虚引用(PhantomReference) :