I did not study CS nor IT. I just became a developer, now working with Java. Actually, since I now work with a big company writing high-scalable web applications, I think I need to be better with details.
I have no understanding of what happens underneath of Java. Java Performance, Server-Side Java might be the buzz words?!! I am very poor with those more of low-level details but I do not know where to look honestly.
I started looking for some keywords in Amazon, ended up reading books like “pragmatic programmer”, “clean code”, “code complete” which IMO they are not what I am looking for.
Could you please give me some learning resources (books, articles, blog posts, online trainings) for this matter? I also read this post as well: Approaching Java/JVM internals
But I think I need a pre-step before jumping into the OpenJDK, right?!
2
What you want to learn involves studying CS. You technically could learn about what the JVM is doing under the covers, but without some Compsci it will all be just a jumble.
The book I had in college for this topic was Programming Language Pragmatics, IIRC. It had a good overview of parsing, semantic analysis, and such but was still fairly gentle. The dragon book is also a classic on the subject, but will be less gentle in its approach.
It sounds to me, though, that you have reached the stage in your craft that you are looking into the realm of computer science, which is a big milestone. Go ahead, jump in, and enjoy the ride. 🙂
Some of the answers suggest a bottom up approach (learn CS or some close equivalent).
You could spend a year plus learning CS and still not have an answer to “what happens underneath of Java”?
Whilst I am of a CS background, I had similar questions about .NET.
These are the things I have done to bring my knowledge of .NET up to scratch.
- Implement my own basic class. Simple use case, implemented a
LinkedList
forIEnumerable<T>
,Iterable<T>
. - Compare my implementation with Microsoft’s/Oracle. You’ll find a lot of things they take into consideration that you did not.
- Read about the topic. For e.g. if you’re implementing your own
Map
/IDictionary<TKey, TValue>
, what is the best bucket size? Why should the bucket size be a prime number? What’s a goodHashCode()
fuction implementation? When do you resize the bucket? - Performance, compare your implementation and the native implementation. It will likely lead you down the route of bounds checking,
Closable
/IDisposable
, garbage collection & its generations. - “Academic” papers, once you’ve exhausted the above, you can learn a lot more detail from academic papers. E.g. dated Paper on IO in Windows & .NET, or Patterns of Parallel Programming.
- There is bound to be some decent interview questions you’ve come across, try implementing an answer and look for the most efficient one. They’ll generally test your knowledge (depth and breadth) as a good measure of progress.
Implementing a collection is just an example. Could easily be an algorithm (BinarySearch
) or an IO library.
To address the absence of Computer Science, I’ve stuck “Computer Science Moudles” in google, loads of good hits
In no particular order, aim to cover java classes that touch on these topics,
- Abstract Data Structures
- Algorithms
- Software Engineering (design patterns), interesting to see how they’re used in a good open source project for e.g.
- Human Computer Interaction
- Operating System (think the java side of processor / memory / IO, threads / GC etc…)
If you have a lot of time, learn C then read the textbook for a Computer Architecture class.
If that level of commitment is too big, read a book on Java performance tuning. A good book will describe why a given parameter has a given effect, how objects are layed out in memory, how a generational garbage collector works, etc.
You can also join the Adopt OpenJDK programme that’s run by Java User Groups around the world to help people ease into the world of OpenJDK. See http://adoptopenjdk.java.net for details.