`

JAVA虚拟机-JVM深入分析整理-程序问题分析(十)

阅读更多

1.字符串存在哪里?

如下代码,aaa,bbb,ccc内容到底存储在哪里呢:

 

public class JvmString {

	public static void main(String[] args) throws InterruptedException {
		String s1 = "aaa";
		String s2 = "bbb";
		String s3 = "ccc";
	}
}
 

 

 1.1.首先我们需要了解类的结构,jvm是如何工作,到底加载 执行我们写class文件的呢?

  请参考: jvm深入分析整理(一)  第一章:JAVA基本结构 ,第二章 堆和方法区(包含常量池)

 1.2.查看编译后class文件

  看下图:我们知道 JVM会把编译好class文件 部分内容加载到方法区(类名,包名,类修饰符,常量池等等),

这里说道常量池 存储除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值,所以字符串存放在方法区中。也就是Perm区

   

1.3 结论

    字符串存放在方法区。

  

2.如果web项目抛出heap oom, 新的请求会遇到什么?

2.1  springmvc写了一个controller,代码如下:

    web容器启动jvm参数

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * <P>
 * Description: spring mvc的一个http请求
 * 测试 jvm OOM后 连接状态
 * 1).OutOfMemoryError: PermGen space :(-Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=8 -XX:PermSize=10M -XX:MaxPermSize=10M  -Xss512k)
 * 2).java.lang.OutOfMemoryError: Java heap space
 *    java.lang.OutOfMemoryError: GC overhead limit exceeded
 * (-Xmx100M -Xms100M -Xmn50M -XX:SurvivorRatio=8 -XX:PermSize=50M -XX:MaxPermSize=50M  -Xss512k)
 * </p>
 * @author xxxxx
 * @version 1.0
 */
@Controller
@RequestMapping("web")
public class WebController extends BaseController {

    @RequestMapping(value = "demo.do")
    public ModelAndView doTest(HttpServletResponse response, HttpServletRequest request, Model model) {

        logger.info("helloWorld!");

        List<String> list = new ArrayList<String>();
        String s="testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest";
        for(int i=1;i<=1000000000;i++){
        	list.add(s+i);
        	//为了看测试效果 休息1ms
        	try {
				TimeUnit.MICROSECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
        }
        // return json
        sendMessage(response, "{\"result\":\"jvm test\"}");
        return null;
    }

}

 2.2 观察gc情况

   

    先执行 jmap -heap pid查看各个代的大小

  

C:\Users\******>jmap -heap 4576
Attaching to process ID 4576, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 104857600 (100.0MB)
   NewSize          = 52428800 (50.0MB)
   MaxNewSize       = 52428800 (50.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 52428800 (50.0MB)
   MaxPermSize      = 52428800 (50.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 41943040 (40.0MB)
   used     = 32742552 (31.225730895996094MB)
   free     = 9200488 (8.774269104003906MB)
   78.06432723999023% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 5215736 (4.974113464355469MB)
   free     = 27144 (0.02588653564453125MB)
   99.48226928710938% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 52428800 (50.0MB)
   used     = 28234728 (26.926734924316406MB)
   free     = 24194072 (23.073265075683594MB)
   53.85346984863281% used
PS Perm Generation
   capacity = 52428800 (50.0MB)
   used     = 36406824 (34.720252990722656MB)
   free     = 16021976 (15.279747009277344MB)
   69.44050598144531% used

16470 interned Strings occupying 2013816 bytes.

   访问 controller  5次:http://127.0.0.1:8080/web/demo.do,观察jstat -gcutil pid变化:

   这里记录fullgc 前后变化情况:

  

看下访问页面状态:

 工具和jconsole查看情况:

heap,cpu状态观察:

old区状态观察:

 

2.3.结论

 影响gc的原因方方面面,有潜在问题(要长时间观察才能发现)和显示问题(每隔一天两系统可能会故障),这里给大家演示的一个例子(如果程序里存在问题,例如:死循环 可能导致jvm频繁做大量fullGC,在进行fullgc时间内 ,所有服务请求都会处于等待状态, 会导致无法提供正常服务 ),如果系统出现频繁fullgc需要大家关注程序健康,系统优化。

  

 

3.java程序中在堆,栈,方法区之间关系

 后续补充....

 

4.JVM相关问题

4.1 为什么HotSpot VM 内存堆的两个Survivor区?

参考讨论主题: HotSpot VM 内存堆的两个Survivor区 

下载:sun白皮书

 

4.2 方法区中的常量池存放的是什么?

参考:JVM重点内容-常量池(二)

 

5.遇到问题排查方式

 后续补充....

 

6.写项目应当注意哪些方面的性能问题

先简单阐述下,每个公司都会有 前台系统(高并发分布式架构) 和后台系统 (业务系统,业务调度复杂)

前台系统:技术点涵盖面较为广泛,这里仅仅列出其中一部分:

       存储或缓存 mysql,hbase,redis,ehcache,bigmemory;

       分布式rpc:dubbo,rmi,hessian;

       多线程相关:threadpool,juc;

       MQ消息队列:rocketmq,redismq,metaQ;

       分布式高并发相关技术:bloomfilter,hystrix;

       框架:springMVC mybatis hibernate等等

后台系统:设计架构会比前台系统简单些,但业务会比较复杂,更加注重于框架,和rpc使用,以及数据监控保证数据准确无误,其他技术点 例如缓存,消息 多线程相关等作为一般使用。

 

6.1 学会看jvm工具相关参数

    jconsole:  内存(eden/survivor/old/perm/codecache)  ,youngGC  time;fullGc time开销,如何调优

    后续补充.... 

 

6.2 mysql连接数影响

    1). 数据库连接数的监控

        公司可能会对每台服务器 设置连接mysql有个 上线的连接数,如果连接数过大可能会引起一些问题

   后续补充....

 

6.3 使用框架的相关问题

    1). hibernate懒加载 慎用(时间开销相对较大),当项目变得很庞大的时候,需要结合 每个请求耗时 结合分析

    后续补充....

 

 

 

7.jvm相关oom测试

7.1.heap OOM

    

import java.util.ArrayList;
import java.util.List;

/**
 *  heap溢出
 *  -Xmx10M -Xms10M -XX:PermSize=5M -XX:MaxPermSize=5M
 * @author *****
 *
 */
public class JvmTest03 {

	final static int _1M = 1024*1024;
	
	public static void main(String[] args) {

		List<Integer> list = new ArrayList<Integer>(); 
		
		 while(true){
			 list.add(_1M);
		 }
	}
}

  

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2245)
	at java.util.Arrays.copyOf(Arrays.java:2219)
	at java.util.ArrayList.grow(ArrayList.java:242)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
	at java.util.ArrayList.add(ArrayList.java:440)
	at com.sohu.train.maven_study_01.JvmTest03.main(JvmTest03.java:21)

 

 

7.2.perm OOM

import java.util.ArrayList;
import java.util.List;

/**
 * 方法区 溢出 permGen
 * -XX:PermSize=2M -XX:MaxPermSize=2M
 * @author ****
 *
 */
public class JvmTest04 {

	public static void main(String[] args) {

		List<String> list = new ArrayList<String>();
		int i = 0;
		        
		while(true){
		    list.add(String.valueOf(i++).intern());
		}
	}
}

 

Exception in thread "Reference Handler" Error occurred during initialization of VM
java.lang.OutOfMemoryError: PermGen space
	<<no stack trace available>>
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Reference Handler"

 

 

更多参考:

1.jvm深入分析整理-知识体系(一)

2.JAVA深入分析整理-程序问题分析(二)

3.JVM重点内容-内存模型及结构(一)

4.JAVA深入分析整理-程序问题分析(二)

  • 大小: 24 KB
  • 大小: 35.7 KB
  • 大小: 39.6 KB
  • 大小: 58.1 KB
  • 大小: 35.7 KB
  • 大小: 137.4 KB
  • 大小: 138.2 KB
分享到:
评论

相关推荐

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    Java虚拟机-jvm故障诊断与性能优化-源码

    在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过源码分析来帮助读者理解其内部工作原理。下面我们将根据书中的主题,详细阐述相关的知识点。 1. **JVM...

    实战Java虚拟机——JVM故障诊断与性能优化

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发人员和运维人员必备技能的书籍。本书作者葛一鸣以其丰富的实战经验,详细阐述了JVM(Java Virtual Machine)的工作原理,以及如何有效地进行故障...

    JAVA虚拟机(JVM)规范(中文版).rar

    JAVA虚拟机(JVM)是Java语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能在任何支持JVM的平台上运行,实现了“一次编写,到处运行”的目标。JVM规范定义了Java程序如何在特定系统上被加载、解析、...

    深入理解Java虚拟机JVM高级特性与最佳实践1

    《深入理解Java虚拟机JVM高级特性与最佳实践》是一本专注于Java开发人员提升技术水平的著作,由周志明撰写。这本书旨在填补Java技术体系中关于Java虚拟机(JVM)知识的空白,帮助读者深入理解JVM的工作原理及其对...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...

    30+个视频+深入理解Java虚拟机(jvm优化+内存模型+虚拟机原理)

    根据提供的文件标题、描述、标签以及部分内容,我们可以深入探讨与Java虚拟机(JVM)相关的多个核心知识点。以下是对这些主题的详细阐述: ### Java虚拟机(JVM)概述 Java虚拟机(JVM)是一种用于执行Java字节码的...

    2015-09-12-Java虚拟机详解----JVM常见问题总结【面试必问】

    Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释执行字节码并管理内存。本篇文章将深入探讨JVM的一些常见问题,这些内容对于理解和优化Java应用程序至关重要,同时也是面试中的高频考察点。 一、JVM内存...

    22 深入拆解 Java 虚拟机-20200406T052847Z-001.zip

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了跨平台的运行环境。深入理解JVM的工作原理对于优化Java程序性能、排查问题以及提升开发能力至关重要。以下将详细介绍JVM的主要组成部分、内存模型、...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发中的关键环节——Java虚拟机(JVM)的专著。本书聚焦于实际应用中的问题解决和性能调优,对于Java开发者和系统管理员来说,是提升技术水平的重要...

    深入虚拟机---JVM调优总结(摘自网上网上大牛分享).pdf

    在深入讨论JVM(Java虚拟机)调优之前,我们有必要先了解一下虚拟机的基本概念和堆栈的区分。Java程序在运行时,所有的数据都存储在JVM的内存模型中。在内存模型中,有两大重要区域,即堆(Heap)和栈(Stack)。堆主要...

    Java-虚拟机.zip

    作为一名Java程序员,我们写过很多Java程序。但是,Java程序到底是如何运行的?如何写出更高效的Java代码……?...封亚飞撰写的《揭秘Java虚拟机-JVM设计原理与实现》深入分析了Java虚拟机的运行机制与原理

    实战JAVA虚拟机 (JVM故障诊断与性能优化)【含源码】

    《实战JAVA虚拟机 (JVM故障诊断与性能优化)》是一本深度剖析JVM的实践指南,旨在帮助读者掌握JVM的内部工作机制,提升故障排查和性能调优的能力。本书可与周志明的《深入理解JAVA虚拟机》相媲美,提供了丰富的源码...

    深入jvm虚拟机

    本书讲述了Java虚拟机一运行 所有Java程序的抽象计算机,还讲了几种与虚拟机密切相关的核心Java API。本书通过分析讲解、可运行的示例、参考资料和applet (它作为文中所述概念的交互式例示),提供了Java技术的深人...

    深入JAVA虚拟机 随书源码 JVM规范

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。深入理解JVM对于优化代码性能、排查问题以及提升编程能力至关重要。本篇文章将详细探讨JVM的工作原理、内存管理...

    java虚拟机深入JVM内核—原理、诊断与优化视频教程网盘下载

    Java虚拟机(JVM)是Java程序运行的核心组件,它为开发者提供了跨平台的执行环境。深入理解JVM内核的原理、诊断与优化对于提升Java应用的性能至关重要。本教程将带你探索JVM的奥秘,从内存管理到垃圾回收,从编译...

    深入java虚拟机 高清pdf 高清高清高清

    《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...

    Java虚拟机规范 Java SE 8版-带目录-pdf

    Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java...

Global site tag (gtag.js) - Google Analytics