JVM内存管理及JAVA性能调优相关笔记

JVM篇
1.JVM内存分配:方法区、Java栈、本地方法栈、堆、程序计数器
方法区:在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
Java栈:用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。
本地方法栈:在JVM规范中,并没有对本地方法栈的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。
:Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。只不过和C语言中的不同,在Java中,程序员基本不用去关心空间释放的问题,Java的垃圾回收机制会自动进行处理。因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。堆由老年代、年轻代、永久代组成。
程序计数器:虽然JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是JVM中的程序计数器的功能跟汇编语言中的程序计数器的功能在逻辑上是等同的,也就是说是用来指示 执行哪条指令的。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

主要参数设置:
-XMX:JVM的堆最大大小
-XMS:JVM的堆默认大小
以上两个配置建议保持一致,因为防止每次垃圾回收完成后,JVM重新分配内存,容易影响性能
-XMN:Java堆中新生代内存大小,老年代的大小为XMX减去它
-XSS:指定线程栈大小,对应单个线程大小,影响能生成的线程数量

2.宽泛的理解JVM的运行过程,JVM启动,加载底层所有的配置,如线程、方法、设置堆大小等,程序先编译为class文件,又通过JIT运行时编译执行代码,执行过程中,生成各种对象...,存放于JVM内存中,有新生代、老生代、永久代,由JVM管理内存,并有垃圾收集器,即GC对个内存中的数据进行回收,保证JVM性能。

3.垃圾收集(GC)是一种stop-the-world(时空停滞)操作,即停止所有正在运行的应用线程,如果此时系统正在进行页面交互,则会引起JVM长时间的停顿。

4.Minor GC和Full GC区别
Minor GC,即新生代GC,即发生在新生代的垃圾收集动作,比较频繁,且回收速度也比较快。
Full GC,即老年代GC,即发生在老年代的垃圾回收动作,次数少,且速度比Minor GC慢10倍以上。

5.Hotspot VM主要有3个组件:VM运行时(Runtime)、JIT编译器(JIT Compiler)以及内存管理器(memory manager)。

6.监控JVM(Hotspot VM)工具:JConsole、visualGC以及visualVM等,当前比较流行的是开源工具 Prometheus(普罗米修斯),感兴趣的可以了解下,此处忽略。

7.Java垃圾收集器调优,三个需要理解的基本原则:
(1)每次Minor GC都尽可能多地收集垃圾对象;
(2)处理吞吐量和延迟问题时,垃圾处理器能使用的内存越大,即Java堆空间越大,垃圾收集的效果越好,应用程序运行也越流畅;
(3)在这三个性能属性(吞吐量、延迟、内存占用)中,任意选择两项进行调优,即为“GC调优的3选2原则”

8.内存泄漏:如果一个永远不再使用的对象,由于等待一个或多个Java对象对它的引用而不能被垃圾收集,就称之为发生了内存泄漏。

JAVA性能调优篇
参考:
Java 性能调优的 11 个实用技巧:http://www.importnew.com/27390.html,个钟见解比较实用,推荐!
java性能调优实战:https://www.cnblogs.com/objJava/p/9035355.html,通过服务器端使用top等命令找出比较消耗资源的线程,并把该线程对应执行的程序dump出来,用来定位分析问题。

猜你喜欢

转载自blog.csdn.net/u013521882/article/details/85173589