虚拟机
文章平均质量分 85
-Hermes-
Stay hungry, Stay foolish.
展开
-
常用虚拟机参数(三)
知识点梳理:如果垃圾回收频繁出现,或者占用了太长的CPU时间,是需要引起重视的哦,亲;解析虚拟机日志-XX:+PrintGC:使用此参数启动Java虚拟机后,只要遇到GC就会打印日志;图示:如下日志信息说明:该日志显示,一共进行了4次GC,每次GC占用一行,在GC前,堆空间使用量约为4MB,GC后堆空间使用量为377KB.当前可用的堆空间总和约为16MB(1原创 2017-03-27 15:19:39 · 1198 阅读 · 0 评论 -
Java虚拟机--无锁(十五)
啥是无锁? 高并发时,"锁"的激烈竞争可能会成为系统瓶颈;无锁使用非阻塞同步的方法,在不使用锁的前提下,确保数据和程序在高并发环境下保持多线程间的一致性。理解CAS 重申"锁"的同步方式一种阻塞的线程同步方式,不同线程在锁竞争时,总不能避免相互等待,从而阻塞当前线程;如何解决这个问题?那就是非阻塞同步咯。代表是ThreadLocal,每个线程拥有各自独立原创 2017-04-24 09:35:41 · 650 阅读 · 0 评论 -
Java虚拟机--Java内存模型(十六)
什么是Java内存模型 并发程序需要保证多线程间数据访问的一致性。如果一个线程中修改了全局变量A,在另外一个线程中读取到的值未必是修改后的新值。Java内存模型用来将这种看似随机的状态变为可控,来屏蔽多线程间可能引发的问题;原子性 原子操作不可中断,也不能被多线程干扰;如:int和byte等数据的赋值操作具备原子特性,而像"a++"这样的操作就不具备原子性,原创 2017-05-15 08:59:10 · 626 阅读 · 0 评论 -
Java虚拟机--Class文件结构(十七)
知识点的梳理: 通过class文件,可以让更多的计算机语言支持Java虚拟机平台。Class文件结构不仅仅是Java虚拟机的执行入口,更是Java生态圈的基础和核心 Class文件 Java语言跨平台依靠的是Class文件,它是异构语言和Java虚拟机之间的重要桥梁,下图显示了各种语言由源代码被编译成Class文件,并最终得以在Java虚拟机上执行的过程:原创 2017-05-15 09:01:03 · 739 阅读 · 0 评论 -
Java虚拟机--ClassLoader(十九)
目录:ClassLoader工作在Class装载的加载阶段,主要作用是从系统外部获得Class二进制数据流 知识点的梳理: 当系统需要加载一个类时,会先从顶层的启动类加载器开始加载,逐层往下,直到找到该类;判断一个类是否需要被加载,是从底层的应用类加载器开始判断的,如果已经在应用类加载器中的类,就不会请求上层类加载器了;判断一个类是否被加载时,顶层类加载器不会询问底层类加原创 2017-05-28 09:24:54 · 962 阅读 · 0 评论 -
Java虚拟机--Class装载系统(二十)
目录:Class文件被载入虚拟机后,会做哪些额外的处理?类加载的具体步骤是怎么样的? Class文件的装载流程 Class类型以文件形式存在,只有被Java虚拟机装载的Class类型才能在程序中使用;系统装载Class类型可分为加载,连接和初始化3个步骤;连接又分为验证,准备和解析3步; 类的装载条件 Class只有在必须要使用的时候才会原创 2017-06-05 09:24:53 · 799 阅读 · 0 评论 -
Java虚拟机--ASM(十八)
ASM体系结构 ASM是Java字节码的操作库,包括Eclipse,Spring,CGLIB都是ASM的使用者; 优势:性能高; 直接工作于底层,使用更加灵活与强大; 劣势:相对复杂;核心组件 Opcodes接口定义了一些常量,尤其是版本号,访问标示符,字节码等信息; ClassRea原创 2017-05-22 16:57:20 · 1457 阅读 · 0 评论 -
Java虚拟机--一段Java程序的生命史(二十三)
一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC; 编译 Java语言的编译期其实是一段"不确定 "的过程,因为可能是一个前端编译器把*.java文件转变为.class文件的过程;也可能是指JVM的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是指使用静态提前编译器(AOT编译器)直接把*.java文件编译成本地机器原创 2017-07-01 09:22:08 · 676 阅读 · 0 评论 -
Java虚拟机--字节码(二十一)
目录:字节码与虚拟机的关系,相当于汇编语言与计算机的关系。当Java源码被编译成Class文件后,虚拟机会将Class文件内的方法字节码载入系统并加以执行; 代码如何执行? Java字节码在虚拟机中,属于基本执行指令,每个Java字节码指令是一个byte数字,并且有一个对应的助记符目前所有的字节码指令大约有200余个,比如下面这些: 一个方法的ja原创 2017-06-09 23:01:09 · 1394 阅读 · 2 评论 -
Java虚拟机常用指令(二十二)
常量入栈指令 该指令的功能是将常数压入操作数栈,根据数据类型和入栈内容的不同,又可以分为const系列,push系列和ldc指令;const:用于特定的常量入栈,入栈的常量隐含在指令本身里。比如:aconst_null将null压入操作数栈;iconst_m1将-1压入操作数栈;指令助记符的第一个字符总是喜欢表示数据类型,i表示整数,l表示长整数,f表示浮点数,d表示双精原创 2017-06-25 15:26:31 · 9243 阅读 · 0 评论 -
Java虚拟机--锁在应用层的优化思路(十四)
减少锁持有时间 问题描述:锁竞争时,单个线程对锁的持有时间与系统性能有着直接的关系。线程持有锁的时间很长,相对的,锁的竞争程度也就越激烈。在程序开发中,应该尽可能减少对某个锁的占有时间,以减少线程间互斥的可能;示例: public synchronized void syncMethod(){ othercode1();mutextMetho原创 2017-04-18 15:49:46 · 871 阅读 · 0 评论 -
Java虚拟机-锁与并发(十三)
锁的基本概念和实现 理解线程安全在多线程的环境下,无论多个线程如何访问目标对象,目标对象的状态应始终保持一致。示例:在多线程环境下使用ArrayList public class ThreadUnSafe { public static List numberList = new AarryList public st原创 2017-04-18 15:48:05 · 701 阅读 · 0 评论 -
Java虚拟机--String在虚拟机中的实现(十二)
知识点的梳理: 虚拟机中,常量池专门用于存放字符串常量。在JDK1.6之前,它在永久区。JDK1.7之后,它转移到了堆中; String对象的特点 String的特点:不变性;针对常量池的优化;类的final定义;不变性能力说明:String对象一旦生成,则不能再对它进行改变;能力作用:当一个对象需要被多线程共享,且访问频繁时,可以省略同步和锁原创 2017-04-10 17:11:41 · 1103 阅读 · 0 评论 -
Java虚拟机的架构(二)
Java虚拟机的基本结构类加载子系统:负责从文件系统或者网络加载Class信息,加载的类信息存放于一块称为方法区的内存空间;方法区:除了类的信息外,可能还会存放运行时常量池信息,包括字符串,字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射);Java堆:它会在虚拟机启动的时候建立,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都存放于Ja原创 2017-03-19 12:06:51 · 617 阅读 · 0 评论 -
虚拟机简介(一)
跨平台的真相:Java虚拟机来做中介虚拟机:一台虚拟的计算机。是一款软件,用来执行一些列虚拟计算机指令,可分为:系统虚拟机:代表,Visual Box,VMware;程序虚拟机:代表,Java虚拟机,它专门为执行单个计算机程序而涉及,在Java虚拟机中执行的指令我们称为Java字节码指令;无法哪种虚拟机,在上面原创 2017-03-11 15:18:18 · 1663 阅读 · 0 评论 -
Java虚拟机--堆的配置参数(四)
最大堆和初始堆的设置说明:Java进程启动时,虚拟机就会分配一块初始堆空间,可以使用参数-Xms指定这块空间的大小;如果初始堆空间耗尽,虚拟机会对堆空间继续扩展,其扩展上限为最大堆空间,最大堆空间可以使用参数-Xmx指定;示例1:通过此例,说明最大堆,初始堆以及系统可用内存的含义和彼此之间的关系:public class HeapAlloc { public stat原创 2017-03-27 15:28:12 · 1806 阅读 · 0 评论 -
Java虚拟机--非堆内存的参数配置(五)
方法区配置 JDK1.6 , JDK1.7配置永久区大小:-XX:PermSize:初始的永久区大小;-XX:MaxPermSize:最大永久区;JDK1.8使用元数据区替代永久区:默认情况下,元数据区只受系统可用内存的限制;-XX:MaxMetaspaceSize:用来指定永久区的最大可用值;栈配置 栈是每个线程私有的内存空间;在Java虚拟机中可原创 2017-03-27 23:06:46 · 1701 阅读 · 0 评论 -
Java虚拟机--垃圾回收算法(六)
知识点的梳理: 名词解释:可达对象:指通过根对象进行引用搜索,最终可以达到的对象;不可达对象:通过根对象进行引用搜索,最终没有被引用到的对象;新生代:存放年轻对象的堆空间。年轻对象指刚刚创建的,或者经历垃圾回收次数不多的对象;老年代:存放老年对象的堆空间。该对象经历过多次垃圾回收依然存活的对象;新生代对象特点:Java虚拟机会将所有的新建对象放入这里。这里的对象朝生夕灭,原创 2017-03-27 23:07:39 · 747 阅读 · 0 评论 -
Java虚拟机--判断可触及性(七)
知识点的梳理: 可触及性包含3种状态:对象只有在不可触及状态时才会被回收!;可触及的:从根节点开始,可以到达这个对象;可复活的:对象的所有引用都被释放,但是对象有可能在finalize()函数中复活;不可触及的:对象的finalize()函数被调用,并且没有复活,就会进入不可触及状态。该状态的对象不可能被复活,因为finalize()函数只会被调用一次;Java提供4个级别的原创 2017-03-27 23:10:01 · 797 阅读 · 1 评论 -
Java虚拟机--对象分配和回收的细节问题(九)
禁用System.gc() System.gc()会直接触发Full GC,同时对老年代和新生代进行回收; 一般情况下垃圾回收应是自动进行的,无需手工触发;过于频繁地触发垃圾回收对系统性能没有好处;虚拟机提供了DisableExplicitGC来控制是否手工触发GC;System.gc()的实现如下:Runtime.getRuntime().gc();Run原创 2017-04-10 17:08:09 · 1083 阅读 · 0 评论 -
Java虚拟机--常用的GC参数(十)
串行回收器相关的参数: -XX:+UseSerialGC:在新生代和老年代使用串行收集器;-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例;-XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接在老年代分配;-XX:MaxTenuringThreshold:设置对象进入老原创 2017-04-10 17:09:33 · 1349 阅读 · 0 评论 -
Java虚拟机--垃圾回收器(八)
串行回收器 简介:是指使用单线程进行垃圾回收的回收器;能力:每次回收时,串行回收器只有一个工作线程;能力特点:对于并行能力较弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现;可用于新生代和老年代;根据作用的堆空间,分为新生代串行回收器和老年代串行回收器;缺点:此回收器工作时,Java应用程序的线程都需要暂停,等待回收完成。在实时性要求较高的场合下原创 2017-03-27 23:11:53 · 605 阅读 · 0 评论 -
Java虚拟机--分析Java堆(十一)
找到内存溢出的原因 堆溢出异常说明:因为大量对象都直接分配在堆上,绝大部分的内存溢出都属于这种情况;原因分析:因为大量对象占据了堆空间,而这些对象都持有强引用,导致无法回收,当大于Xmx参数指定的堆空间大小时,就会抛出溢出错误;示例1:public class SimpleHeapOOM {public static void main(String[] args原创 2017-04-10 17:11:11 · 506 阅读 · 0 评论 -
利用 EXE4j 生成 ".exe" Java Swing程序
大上周刚刚了结一个桌面软件项目。这个项目需要用到SNMP协议,我刚开始尝试使用不熟的C#,但始终无法ping通目标主机,反而是Java一下就通了,看来还是熟悉的东西比较稳妥。但是用Java的话,大家都懂的~~~(宝宝心里苦啊)Java 搭建桌面程序不是不可以,而是需要面临很多棘手的问题。软件编写完成后,本来以为大功告成,奈何还要解决编译、打包、如何运行在别人的机器上等等诸如此类的问题,麻烦...原创 2018-11-06 11:53:58 · 894 阅读 · 0 评论