1. 多线程并发访问一个静态方法(static method)会不会有什么性能影响?

  思考:不会,原因是static method编译后及时一串指令(jvm中的静态方法区,也叫non-heap(包含了Perm Gen),jvm规范对该区没有GC 要求);

     如果没有数据竞争,就不会有并发不安全的问题。

       那个数据调用了改方法,则对改数据做一系列的指令。

2.所谓的minor GC ,full GC 和常见的内存溢出,你的理解是什么?

  思考:jvm 内存模型分几大区域:栈(线程)、堆(实例)、静态方法区(class,method等),

    GC 都是发生在堆内存(heap),堆中分为一个Eden、两个survivor、一个Tunured;清空Eden叫minor GC,清空Tenured叫full GC ,suvivor完成数据的交换。

    内存溢出在可以发生在任何区域

    栈帧溢出:StackOverflowError:Thrown when a stack overflow occurs because an application recurses too deeply.(-Xss 2048K 可以调整每个线程的栈内存容量)

    堆溢出:OutOfMemoryError:Java heap space (调整参数为-Xms128m -Xmx521m)

    静态方法栈溢出:OutOfMemoryError:PermGen space (调整参数为: -XX:PermSize=256m -XX:MaxPermSize=512m)

3.关于static、final、static final修饰的变量 你有什么理解?

  static 和 final 修饰的变量:在 Perm Gen(方法区)中。

  而static final两个修饰符同时修饰的变量 并不在此区域中。

  验证代码和现象如下:

  1. package demo;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6. try {
  7. Thread.sleep(10*1000);
  8. System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
  9. Thread.sleep(10*1000);
  10. System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
  11. Thread.sleep(10*1000);
  12. System.out.println(new ConstB().str10002);// 无明显变化
  13. Thread.sleep(10*1000);
  14. System.out.println(ConstC.str10000);//无明显变化
  15. Thread.sleep(10*1000);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20.  
  21. }

    

这个例子有些值得思考的地方:比如static final为何没有出现在PermGen中,我去查阅了有关资料,说static final是编译期常量,不会引发类的初始化。(http://www.cnblogs.com/jxzheng/p/5191037.html)

于是,我在test中加了一行代码:Class.forName()

  

  1. package demo;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6. try {
  7. Thread.sleep(10*1000);
  8. System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
  9. Thread.sleep(10*1000);
  10. System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
  11. Thread.sleep(10*1000);
  12. System.out.println(new ConstB().str10002);// 无明显变化
  13. Thread.sleep(10*1000);
  14. Class.forName("demo.ConstC");
  15. System.out.println(ConstC.str10000);//20秒后,内存开始变化
  16. Thread.sleep(10*1000);
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21.  
  22. }

  

  

关于java和jvm的思考的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  3. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  4. 如果你不了解Java的JVM,那真的很难进BAT一线大厂!

    前言 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试 ...

  5. java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统

    参考书籍:<深入理解java虚拟机>,三天时间用了八个小时看完,像读一本武侠小说,挺爽. 另外需声明:图片都是从我自己的csdn博客转载,所以虽然有csdn标识,但都是我自己画的图片. j ...

  6. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  7. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  8. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  9. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

随机推荐

  1. Go used as value问题

    练习Go变参时遇到一个报错:used as value 代码如下: // 错误代码 func myfunc(arg ...int) { for _, n := range arg { fmt.Prin ...

  2. leetcode python 012 hard 合并k个有序链表

    #[LeetCode] Merge k Sorted Lists 合并k个有序链表(升序) import numpy as npimport time class Node(object):    d ...

  3. js--------1.时间

    //获取当前时间 yyyy-MM-dd function getNowFormatDate() { var date = new Date(); var seperator1 = "-&qu ...

  4. ADO.NET之SqlConnection、sqlcommand的应用(学习笔记)

    一.知识描述点 1.SqlConnection (1)使用SqlConnection类可以连接到SQL Server数据库.SqlConnection对象的主要属性和方法如下: ——属性:Connec ...

  5. [Java] [Lock] [Synchronized VS ReentrantLock]

    Overview java编写多线程程序时,为了保证线程安全,需要对数据进行同步,经常用到的两种同步方式就是synchronized和重入锁ReentrantLock. 相似点 都是加锁方式 都是阻塞 ...

  6. [Ajax] 如何使用Ajax传递多个复选框的值

    HTML+JavaScript代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  7. springboot区分开发、测试、生产多环境的应用配置(二)

    转:https://www.jb51.net/article/139119.htm springboot区分开发.测试.生产多环境的应用配置(二) 这篇文章主要给大家介绍了关于maven profil ...

  8. scrapy框架之递归解析和post请求

    递归爬取解析多页页面数据 scrapy核心组件工作流程 scrapy的post请求发送 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析 ...

  9. 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍

    本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...

  10. Visual Studio AI 离线模型训练(Windows10)

    一.序 环境搭建:[查看] samples-for-ai项目下载:[下载],两个版本,一个2018年6月15日前,一个2018年6月15日-16日版本(当前最新版本). 在环境搭建过程中,通过git ...