jvm

【006】【JVM——垃圾收集器总结】

杀马特。学长 韩版系。学妹 提交于 2020-02-29 17:08:31
JVM ——垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论,垃圾收集据是内存回收的具体实现。 Java 虚拟机规范中对垃圾收集器应该如何实现没有规定,不同的厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,一般都会提供参数供用户根据自己的所用特点和要求组合出各个年代所使用的收集器。下面是基于 JDK 1.7 Update 14 之后的 HotSpot 虚拟机垃圾收集器。如果两个收集器之间有连线就说明它们可以搭配使用。 直到现在还没有最好的收集器,更加设有万能的收集器,只是对具体应用选择最合适的收集器。 垃圾收集器概览图如下: Serial 收集器 Serial 收集器是最基本、历史最悠久的收集器,它是一个单线程的收集器,即它只会使用一个 CPU 或一条收集线程去完成垃圾收集工作,而且在进行垃圾收集时, 必须暂停其他所有的工作钱程,直到它收集结束,虽然它有很大缺点,但依然是虚拟机运行在 Client 模式下的默认新生代收集器。它也有着优于其他收集器的地方: 简单而高效。 Serial 收集器没有线程交互的开销, 专心做垃圾收集,可以获得很高的单线程收集效率。 运行示意图如下: ParNew 收集器 ParNew 收集器其实就是 Serial 收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括 Serial 收集器可用的所有控制参数、、收集算法

关于String StringBuffer StringBuilder

余生长醉 提交于 2020-02-29 11:09:46
0. String对象的创建 1、关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world"); 问题是参数"Hello world"是什么东西,也是字符串对象吗?莫非用字符串对象创建一个字符串对象? 2、当然,String类对象还有一种大家都很喜欢的创建方式:String s="Hello world"; 但是有点怪呀,怎么与基本数据类型的赋值操作(int i=1)很像呀? 在开始解释这些问题之前,我们先引入一些必要的知识: 1. Java class文件结构 和常量池 我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行。 class文件是8位字节的二进制流 。这些二进制流的涵义由一些紧凑的有意义的项 组成。比如class字节流中最开始的4个字节组成的项叫做魔数 (magic),其意义在于分辨class文件(值为0xCAFEBABE)与非class文件。class字节流大致结构如下图左侧。 其中,在class文件中有一个非常重要的项—— 常量池 。这个常量池专门放置源代码中的符号信息(并且不同的符号信息放置在不同标志的常量表中)。如上图右侧是HelloWorld代码中的常量表(HelloWorld代码如下)

JVM第三天 Java Class File structure

女生的网名这么多〃 提交于 2020-02-29 09:39:33
Reference: http://viralpatel.net/blogs/tutorial-java-class-file-format-revealed/ A Java class file is consist of 10 basic sections: 1.Magic Number: 0xCAFEBABE 2.Version of Class File Format: the minor and major versions of the class file 3.Constant Pool: Pool of constants for the class 4.Access Flags: for example whether the class is abstract, static, etc. 5.This Class: The name of the current class 6.Super Class: The name of the super class 7.Interfaces: Any interfaces in the class 8.Fields: Any fields in the class 9.Methods: Any methods in the class 10.Attributes: Any attributes of the class

如何在C/C++中调用Java

旧街凉风 提交于 2020-02-29 07:52:36
转的一篇文章,看的不懂,先坐下记录吧~~~ java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗口,因为它使用了JNI(Java Native Interface)的技术。通过这种技术,开发人员不一定要用命令行来启动Java程序,可以通过编写一个本地GUI程序直接启动Java程序,这样就可避免另外打开一个命令窗口,让开发的Java程序更加专业。 JNI答应运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,答应将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述。 本文将介绍如何在C/C++中调用Java方法,并结合可能涉及到的问题介绍整个开发的步骤及可能碰到的难题和解决方法。本文所采用的工具是Sun公司创建的 Java Development Kit (JDK) 版本 1.3.1,以及微软公司的Visual C++ 6开发环境。

JVM实用参数 GC日志

偶尔善良 提交于 2020-02-29 07:12:12
原文章地址: http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配模式。 -XX:+PrintGC 参数-XX:+PrintGC(或者-verbose:gc)开启了简单GC日志模式,为每一次新生代(young generation)的GC和每一次的Full GC打印一行信息。下面举例说明: [GC 246656K->243120K(376320K), 0.0929090 secs] [Full GC 243120K->241951K(629760K), 1.5589690 secs] 每行开始首先是GC的类型(可以是“GC”或者“Full GC”),然后是在GC之前和GC之后已使用的堆空间,再然后是当前的堆容量,最后是GC持续的时间(以秒计)。 第一行的意思就是GC将已使用的堆空间从246656K减少到243120K,当前的堆容量(译者注:GC发生时)是376320K,GC持续的时间是0.0929090秒。 简单模式的GC日志格式是与GC算法无关的,日志也没有提供太多的信息。在上面的例子中,我们甚至无法从日志中判断是否GC将一些对象从young generation移到了old generation

浅谈 G1 GC 日志格式

给你一囗甜甜゛ 提交于 2020-02-29 06:44:53
在 Java9 中,G1 GC 将成为默认的垃圾收集器,G1 垃圾收集器的关键特性之一是能够在不牺牲吞吐量的同时,限制 GC 暂停时间(即可以设置所需的最大停顿时间)。 由于 G1 GC 正在逐渐成为默认的垃圾收集器,它的使用与关注度也会逐渐增加。因此在调整 JVM 大小和排查问题的情况下,必须先理解 G1 GC 的日志格式,接下来将介绍如何理解 G1 GC 的日志格式。由于 G1 GC 日志中有许多与子任务相关的信息,因此为了更好地理解和利用这些信息,我推荐使用 GC 日志分析工具: http://gceasy.io/ 。 打开 GC 日志 可以使用下面的参数打开 GC 日志: -Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps 在这里 GC 日志会写入到 /home/gc.log 文件里。 Minor GC 日志 当发生 Minor GC 时,在 GC 日志文件里会有以下内容: 上图展示了在 G1 垃圾收集日志中的 Young GC 事件。 1、 2015-09-14T12:32:24.398-0700: 0.356 — 在这里 2015-09-14T12:32:24.398-0700: 0.356 表示 GC 发生的时间,其中 0.356 表示 Java 进程启动 356 毫秒之后发生了 GC。 2、

Jprofile解析dump文件使用详解

ⅰ亾dé卋堺 提交于 2020-02-29 06:36:02
1 Jprofile简介 官网 下载对应的系统版本即可 性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志. 2 功能简介 选择attach to a locally running jvm 选择需要查看运行的jvm,双击或者点击start 等待进度完成,弹出模式选择 Instrumentation模式记录所有的信息。包括方法执行次数等Sampling模式则只支持部分功能,不纪录方法调用次数等,并且更为安全 由于纪录信息很多,java运行会变的比正常执行慢很多,sampling模式则不会 常规使用选择sampling模式即可,当需要调查方法执行次数才需要选择Instrumentation模式,模式切换需要重启jprofiler 点击OK 选择Live Momory可以查看内存中的对象和大小 选择cpu views点击下图框中的按钮来纪录cpu的执行时间 这时候可以在外部对需要录的jvm操作进行记录了,得出的结果可以轻松看出方法执行调用过程与消耗时间比例: 根据cpu截图的信息,可以找到效率低的地方进行处理,如果是Instrumentation模式则在时间位置会显示调用次数 在Thread界面则可以实时查看线程运行状态,黄色的是wait 红色是block 绿色的是runnable蓝色是网络和I/O请求状态

JVM远程调试功能

房东的猫 提交于 2020-02-29 05:54:22
有时候想调试线上的程序 可以启用远程调试功能 在本地调试远程代码。 远程JVM启用调试模式 /usr/local/jdk/bin/java -server -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=128m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1506 -jar /home/web/api-1.0-SNAPSHOT/lib/api-1.0-SNAPSHOT.jar --spring.config.location=file:/home/web/api-1.0-SNAPSHOT/conf/    -XDebug 表示虚拟机启用调试功能 -Xrunjdwp 加载JDWP transport 调试程序JVM使用的进程之间通讯方式 dt_socket socket通讯 server=y/n JVM是否需要作为调试服务器执行 address 调试服务器监听的端口号 suspend=y/n 调试客户端建立连接之后启动虚拟机 JVM启动之后用验证监听的端口号是否生效了 netstat -anp | grep 1506 本地调试配置 然后 debug 启动 访问远程服务器某个服务 在本地就支持打断点调试了。 欢迎关注我的微信公众号《笑笑笑技术圈》

为什么 main 方法是 public static void?

荒凉一梦 提交于 2020-02-29 02:44:20
0、 引言: 之前在校招时,旁边的面试官问过这样一个问题:如何不在 main 函数里打印出一行字符串呢(也不允许在main里调用函数)? 如果你不能回答上来没关系,看了本文你就会有了答案。其实 main 函数我们每天 coding 都会接触,但是不一定每个同学都了解或注意到它为什么要这么设计,为什么不能那么写? 言归正传,Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public、static、void 的?当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么main方式是public、static、void,这篇文章尝试去找到一些答案。 Main方法是Java程序的入口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。 Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数: public static void main(String

学习笔记

纵饮孤独 提交于 2020-02-29 01:01:28
类的加载过程,类加载器是什么东西,有几种类型 jvm调优 选择jvm版本,client、server 堆区大小的指定 合理的选择收集器 小工具 jps.ext:打印jvm进程(对比linux的PS打印linux进程),如:jps -l -v jstat.exe:查看jvm运行时信息,如查看jvm进程的gc信息,100毫秒一次,循环打印20次:jstat -gc pid 100 20 jvisualvm:最欠打的运行监视和故障处理工具,可以监控内存泄漏跟踪垃圾回收,执行内存分析,cpu分析,线程分析 记得添加Visual GC插件,更加清晰 jvm参数 内存参数 -Xms:初始堆大小,包括年轻代和老年代 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:年轻代和老年代的比值 -XX:SurvivorRatio=n:年轻代中Eden与两个SurvivorRatio的比值 -XX:MaxPermSize=n:设置持久代的大小 收集器参数 -XX:+UserSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParalledlOldGC:设置老年代并行收集器 -XX:+UseConcmarkSweepGC:设置老并发收集器 ...... 备注 实际中,设置堆初始内存-Xms,堆最大内存-Xmx