JavaGuide
JavaGuide copied to clipboard
「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
不一定吧 -> https://blog.csdn.net/yangshangwei/article/details/82866216
根据 https://www.javatt.com/p/47643 >JVM 中有三类常量池 1. 静态常量池(class 文件中的常量池) 2. 运行时常量池 3. 字符串常量池 他们再 JDK6~8 中分别位于不同的地方 > 在JDK6及之前的版本: 静态常量池在Class文件中。 运行时常量池在Perm Gen区(也就是方法区)中。(所谓的方法区是在Java堆的一个逻辑部分,为了与Java堆区别开来,也称其为非堆(Non-Heap),那么Perm Gen(永久代)区也被视为方法区的一种实现。) 字符串常量池在运行时常量池中。 >在JDK7版本: 静态常量池在Class文件中。 运行时常量池依然在Perm Gen区(也就是方法区)中。在JDK7版本中,永久代的转移工作就已经开始了,将譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。但是运行时常量池依然还存在,只是很多内容被转移,其只存着这些被转移的引用。网上流传的一些测试运行时常量池转移的方式或者代码,其实是对字符串常量池转移的测试。...
作者在 **JDK1.8之后** 这一小节的开头中写道: > JDK1.8之后再解决哈希冲突问题时有了较大的变化,**当链表长度大于阈值(默认为8)时,将链表转化为红黑树**,以减少搜索时间 这段话加粗部分的描述是不准确的,当链表长度大于阈值时,会尝试调用树化方法`treeifyBin`,但这不意味着会将链表转为树:  当我们查看树化方法`treeifyBin`(JDK1.8 HashMap源码)时,应注意到这么一行代码(757行):  我们发现,**当哈希表的`length`小于`MIN_TREEIFY_CAPACITY` (默认为64)时,并不会真正树化,而只是执行`resize()`,也就是扩容的操作**,这一点在对树化方法`treeifyBin`以及`MIN_TREEIFY_CAPACITY` 的注释中都有提到:   如果我的看法有什么错漏之处,恳请大家补充指正
如果你是热爱分享的人 如果你是一个热爱学习,善于总结的人 如果你也想参与接近 100k star的开源项目 ...... 如果你想做的话,你都可以把自己想写的内容投稿给我,你的文章将被更多人看到,你所写的东西也可能会默默影响到很多人。 投稿的要求很简单,你能把一个知识点讲清楚就好。 ## 推荐的题材 尽量写 [JavaGuide](https://snailclimb.gitee.io/javaguide/#/) 上没有总结到的一些知识点或者对现有内容进行完善。 - 面试题系列:比如SpringBoot自动装配原理?、分布式锁等等 - 知识点总结:比如 搜索引擎、消息中间件、微服务等等 ## 投稿奖励 投稿自己的原创文章成功之后,不仅可以顺利放到 [JavaGuide](https://github.com/Snailclimb/JavaGuide) 供大家学习。还能获得一些报酬,根据文章内容奖励 100~300元(单篇)。 ## 投稿方式 将你的文章以 Markdown 格式发送到我的邮箱:[email protected] 或者直接在...
![Uploading image.png…]()
建议修改答案如下 为什么java中只有值传递: 1.选择值传递的原因:为了保护实参,牺牲空间做值拷贝 2.只保留的原因:统一只用值传递,简单方便安全易懂(这个想法和取消指针不谋而和) 注:其他语言保留引用传递的原因:方便修改实参,不用拷贝实参,节约空间时间 (才疏学浅,欢迎斧正)
如redis-内存回收和内存共享部分所描述: 因为c语言不具备自动内存回收功能,**当将redisObject对象作为数据库的键或值而不是作为参数存储时**其生命周期是非常长的,为了解决这个问题,Redis自己构建了一个内存回收机制,通过redisobject结构中的refcount实现.这个属性会随着对象的使用状态而不断变化。 1、创建一个新对象,属性初始化为1 2、对象被一个新程序使用,属性refcount加1 3、对象不再被一个程序使用,属性refcount减1 4、当对象的引用计数值变为0时,对象所占用的内存就会被释放 其中不太理解如何进行这种基于refcount的引用计数回收,对于过期的数据进行的是定期删除和惰性删除,当内存要溢出时进行的是淘汰机制(noeviction、volatile-lru等),但是文中所描述的这种引用计数的回收方式在何时进行呢?