目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

标签: JVM (9)

Java 的基本类型

AsmTools  在 OpenJDK 里有一个 AsmTools 项目,用来生成正确的或者不正确的 Java .class 文件,主要用来测试和验证。我们知道直接修改.class文件是很麻烦的,虽然有一些图形界面的工具,但还是很麻烦。  AsmTools 引入了两种表示 .class 文件的语法: JASM 用类似 Java 本身的语法来定义类和函数,字节码指令则很像传统的汇编。 java -jar asmtools.jar jdis Test.class JCOD 整个 .class 用容器的方式来表示,可以很清楚表示类文件的结构。 java -jar asmtools.jar jdec Test.class AsmTools修改字节码 Java源码文件 public class Foo { public static void main(String[] args) { boolean flag = true; if (flag) System.out.println("Hello, Java!"); if (flag == true) System.out.prin....

Java 代码运行流程

编译执行  直接将代码编译成 CPU 所能理解的代码格式,机器码。  比如下图的中间列,就是用 C 语言写的 Helloworld 程序的编译结果。可以看到,C 程序编译而成的机器码就是一个个的字节,它们是给机器读的。那么为了让开发人员也能够理解,我们可以用反汇编器将其转换成汇编代码(如下图的最右列所示)。 ; 最左列是偏移;中间列是给机器读的机器码;最右列是给人读的汇编代码 0x00: 55 push rbp 0x01: 48 89 e5 mov rbp,rsp 0x04: 48 83 ec 10 sub rsp,0x10 0x08: 48 8d 3d 3b 00 00 00 lea rdi,[rip+0x3b] ; 加载 "Hello, World!\n" 0x0f: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 0x16: b0 00 mov al,0x0 0x18: e8 0d 00 00 00 call 0x12 ; 调用 printf 方法 0x1d: 31 c9 xor ecx,ecx 0x1f: 89 45 f8 mo....

虚拟机图形化工具

Jconsole  JConsole (Java Monitoring and Management Console)是一种基于 JMX 的可视化监视、管理工具,它管理部分的功能是针对 JMXMBean 进行管理,由于 MBean 可以使用代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进行访问。  jconsole集成了线程与内存的可视化展示。 Jconsole连接方式 本地连接:通过JDK/bin目录下的“jconsole.exe”启动JConsole 后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用 jps 来查询了。 远程连接 # 生成项目jar mvn install # scp将jar包进行远程复制 sudo scp /Users/daniel/Desktop/jvm-demo-0.0.1-SNAPSHOT.jar root@172.16.244.151:/usr/local # 将jar包启动 #nohup代表以守护线程的方式启动 # -Dcom.sun.management.jmxremote.port 开启远程访问JXM端口 nohup....

虚拟机工具

虚拟机工具的作用  使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。  需要分析的数据包括:运行日志、异常堆栈、GC 日志、线程快照 ( threaddump/javacore文件)、堆转储快照( heapdump/hprof文件)等。 虚拟机工具JPS  jps (JVM Process Status Tool)是其中的典型jvm工具。除了名字像 UNIX 的 ps 命令之外,它的功能也和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class, main()函数所在的类)名称以及这些进程的本地虚拟机唯- ID (Local Virtual Machine Identifier, LVMID),虽然功能比较单一,但它是使用频率最高的 JDK 命令行工具 -l #展示类全限定名,如果进程执行的是Jar包则输出Jar路径。 -v #输出虚拟机进程启动时JVM参数 C:\Users\soulboy>jps 10488 7944 DemoApplication 1740 Jps 2252 Launcher 4988 Remot....

内存分配

Java堆内存分配 对象分配遵循的规则 对象主要分配在新生代的 Eden 区上。 如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配。 少数情况下也可能会直接分配在老年代中。(新生代放不下的情况下、对象比较大的情况下[几乎占据From or To 区的全部,不如直接复制到老年代]。) 查看对象分配在哪个区域 //-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC public class TestJVMFirst { private static final int byteSize = 1024 * 1024; public static void main(String[] args) { byte[] bytes = new byte[40 * byteSize]; //40MB内存 } } 控制台输出 Heap PSYoungGen total 76288K, used 47514K [0x000000076b000000, 0x0000000770500000, 0x00000007c0000000) eden ....

JVM垃圾收集器

JVM垃圾收集器  垃圾收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。 并发与并行(垃圾回收器) 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个 CPU上。 垃圾回收器分类 串行回收,Serial回收器,单线程回收,全程“Stop The World”。 并行回收,名称以Parallel开头的回收器,多线程回收,全程“Stop The World”。 并发回收,cms与G1,多线程分阶段回收,只有某阶段会“Stop The World”。 Serial收集器  Serial是一个单线程的垃圾收集器。采用“复制”算法,适用于新生代特点如下: “Stop The World”,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在用户不可见的情况下把用户正常工作的线程全部停掉。 使用场景:多用于桌面应用,Client端的垃圾回收器。 桌面应用内存小,进行垃圾回收的时间....

垃圾回收算法

为什么要垃圾回收  Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。 对象存活算法之引用计数法  堆中每个对象实例都有一个引用计数。当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1。(局部变量表的生命周期跟随方法的运行和结束) 优点  引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利。 缺点  无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0. 在代码中分析JVM是否采用引用计....