Alex‘s Blog

Coding My Life


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

第5章 调优案例分析与实战

发表于 2017-10-30 | 分类于 技术 , 学习 , JVM

高性能硬件上的程序部署策

三大块非用户程序时间:

  1. 编译时间
  2. 垃圾收集时间
  3. GC时间
    1. 新生代minor GC
    2. 老年代Full GC
      编译时间是指虚拟机的JIT编译器编译热点代码的耗时。Java的运行时编译最大的缺点就是它进行编译需要消耗程序正常的运行时间。

第4章 虚拟机性能监控与故障处理工具

发表于 2017-10-30 | 分类于 技术 , 学习 , JVM

概述

给定一个系统定位问题的时候,只是、经验是关键基础,数据时依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常对战、GC日志、线程快照(threaddump/jvacore文件)、堆转存储快照(headdump/hprof文件)等。

JDK的命令行工具

解决liunx下jstat无法查看虚拟机状态的问题:连接。

启动后,这时候使用jstat查看该tomcat的状态提示pid not found,使用jps也没有这条信息,但是ps查看明明就有,顿时感觉很坑爹.
一顿查找资料后,逐步解决.
首先java进程会向/tmp里写文件,路径为hsperfdata$user/$pid,如果在tmp下没有这个文件jps就会查找不到这个线程.如果tmp下的java临时文件有误就会提示xx – process information unavailable,这时候把tmp下hsperfdata这样的都删了,然后重启java程序,再使用jps就能正常输出结果了.

然后tomcat的catalina.sh里开头设置CATALINA_TMPDIR=/tmp,这样下面的脚本执行-Djava.io.tmpdir=\”$CATALINA_TMPDIR\” \,这样就可以达到效果是加上java参数-Djava.io.tmpdir=/tmp.
这时候重启tomcat后,输入jstat -gcutil pid,就可以显示jvm的情况了

第3章 垃圾收集器与内存分配策略

发表于 2017-10-30 | 分类于 技术 , 学习 , JVM

概述

  1. 每个栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内存基本上是在类结构确定下来是就已知的。
  2. 程序计数器、虚拟机栈、本地方法栈这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。而java堆和方法区则不一样。

对象已死吗

Java堆回收
  1. 主流的java虚拟机里面没有选用引用计数器算法来管理内存,其中最主要的原因是它很难解决对象之间互相循环引用的问题。
  2. 通过可达性分析算法来判定对象是否存活着,算法思路:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
  3. 可作为GC Roots的对象包括下面几种:
    1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
    2. 方法区中类静态属性引用的对象
    3. 方法区中常量引用的对象
    4. 本地方法栈中JNI引用的对象
  4. java将引用分为强引用、软引用、弱引用、虚引用,引用强度逐渐减弱。
  5. 可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程。
  6. finalize()方法中对象逃脱死亡命运的最后一次机会。
  7. 任何一个对象的finalize()方法都只会被系统自动调用一次,如果对象面临下一次回收,它的finalize()方法不会再次被执行。尽量避免使用它。
阅读全文 »

第2章 Java内存区域与内存溢出异常

发表于 2017-10-30 | 分类于 技术 , 学习 , JVM

计数器

  1. 字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令。
  2. 每个线程有独立的计数器。
  3. 如果正在执行的是Native方法,这个计数器值为空(Undefined)。
  4. 计数器的内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈

  1. 与计数器一样,虚拟机栈也是线程私有的,生命周期与线程相同。

  2. 描述的是Java方法执行的内存模型

  3. 栈帧是方法运行时的基础数据结构。

  4. Java虚拟机规范对这个区域规定了两种异常情况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

    本地方法栈

  5. 为虚拟机使用到的Native方法服务。

  6. 本地方法栈也会抛出StackOverflowError和OutOfMemory异常。

  7. 与虚拟机栈的作用相似。

Java堆

  1. Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。以为目的是存放对象实例。
  2. 是垃圾收集器管理的主要区域。
  3. 堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
阅读全文 »

第1章 走进Java

发表于 2017-10-30 | 分类于 技术 , 学习 , JVM

java优点

  1. 摆脱平台束缚;
  2. 提供一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题
  3. 实现了热点代码监测和运行时编译及优化
  4. 有一套完善的应用程序接口,还有无数来自商业机构和开源社区的第三方类库来帮助它实现各种各样的功能

java技术体系

Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK,JDK是用于支持Java程序开发的最小环境

Java类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境。

我的第一篇博客

发表于 2017-10-30 | 分类于 生活

首先要纪念一下,这是我第一次写博客,这也是我的第一篇博文。我希望以后几年,十几年,几十年都能够坚持写下去,与大家分享生活与工作中一切好的东西!

我一直都想把工作和生活中的点点滴滴以博文的方式跟大家分享,但是一直都没有付诸行动(其实就是懒),直到前段时间跟同一年以应届生身份进公司的同事聊天时才知道他一直在坚持写博客,他向我推荐了他的博客,还告诉我怎么去搭建博客站点(这里要感谢github),这才完全激起了我的兴趣。当然我不希望自己只有三分钟热度,我希望自己能够一直写下去。

当然,不只是一时兴起,我打算写博客还基于几个原因:

  1. 我一直是分享的受益者,这些年通过大家的分享帮助我解决了很多问题,因此,我希望尽最大努力回馈大家;
  2. 将工作中遇到的一些坑或是解决的某些技术问题做一个总结,以备后期查阅;
  3. 记录技术与生活相关的学习笔记,展示自己的技术栈,督促自己必须不断地学习;
  4. 写一些生活感想,记录一些生活的美好瞬间;

加油吧,少年!(嘿嘿)

1…45
Alex Wong

Alex Wong

不管年龄大小,每个人都是我的老师

46 日志
57 分类
55 标签
Links
  • shalk
  • luckylau
© 2020 Alex Wong
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4